Android - 了解Activity | 青训营笔记

160 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第1天
今天结合青训营第二节的授课内容,分享一下《第一行代码》第二章——探究活动2.1节到2.5节的读书笔记。
主要是讲安卓开发最基础的组件之一——Activity。
零基础的同学可以通过这部分内容对安卓开发有一个初步的概念。

Activity的用法

创建Activity

Activity目录:app/src/main/java/com.example.myapplication/MainActivity.java 布局文件目录:app/src/main/res/layout/activity_main.xml

  1. 为活动加载布局文件:在Activity的onCreate函数中添加

    setContentView(R.layout.activity_main);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
  1. 在AndroidManifest.xml (app/src/main/AndroidManifest.xml) 中注册Activity,一般由Android Studio自动完成。

    <application>
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    

    其中,

    <action android:name="android.intent.action.MAIN" />

    两行表示该活动是这个项目的主活动。

使用Toast

Toast: 提示消息

Toast的用法:通过静态方法makeText()创建一个Toast对象,调用show()将Toast显示出来。

Button button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Toast.makeText(MainActivity.this, "message", Toast.LENGTH_SHORT).show();
    }
});

使用Menu

  1. 在app/src/main/res/menu中新建main.xml,<item>标签标识具体的菜单项。

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:id="@+id/add_item"
            android:title="Add"/>
        <item
            android:id="@+id/remove_item"
            android:title="Remove"/>
    </menu>
    
  1. 在Activity类中重写onCreateOptionsMenu方法创建菜单。

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true; //true: 显示菜单;false: 不显示菜单
    }
    
  1. 在Activity类中重写菜单响应事件onOptionsItemSelected()。

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.add_item:
                Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show();
                break;
            case R.id.remove_item:
                Toast.makeText(this, "You clicked Remove", Toast.LENGTH_SHORT).show();
                break;
            default:
        }
        return true;
    }
    

销毁活动

按返回键或调用finish()方法。

intent的用法

Intent是Android程序中各组件之间进行交互的一种重要方式,一般可用于启动活动,启动服务以及发送广播等场景。

显式intent

此处用到的Intent的构造函数:Intent(Context packageContext, Class<?> cls) 第一个参数要求提供一个启动活动的上下文,第二个参数指定想要启动的目标活动。

button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent = new Intent(MainActivity.this, Activity2.class);
        startActivity(intent);
    }
});

隐式intent

AndroidManifest中,在<activity>标签下配置<intent-filter>的内容,指定当前活动能够响应的action,category,data等。

<activity
    android:name=".Activity2"
    android:exported="false" >
    <intent-filter>
        <action android:name="com.example.myapplication.ACTION_START"/>
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

将点击事件修改为:

button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent = new Intent("com.example.myapplication.ACTION_START");
        startActivity(intent);
    }
});

此处用到的intent的构造函数直接传入了action的字符串,表示我们要启动能够响应"com.example.myapplication.ACTION_START"这个action的活动,同时category自动设为默认值。

其他用法

  • 启动系统其他程序的活动,比如调用浏览器
  • 向下一个活动传递数据
  • 返回数据给上一个活动

活动的生命周期

返回栈

Snipaste_2022-08-04_18-49-39.png

活动的状态

  1. 运行状态:活动位于返回栈栈顶时。
  2. 暂停状态:活动不在栈顶位置,但依然可见时(栈顶的活动并不占满整个屏幕)。
  3. 停止状态:活动不在栈顶位置,而且不可见时。可能会被系统回收。
  4. 销毁状态:活动从返回栈中移除后。容易被系统回收。

活动的生命周期

activity_lifecycle.png

  • 完整生存期:onCreate()方法和onDestroy()方法之间。一般会在onCreate()方法中完成活动的初始化操作,在onDestroy()方法中完成释放内存的操作。
  • 可见生存期:onStart()方法和onStop()方法之间。可以通过这两个方法合理管理那些对用户可见的资源,比如在onStart()方法中加载资源,在onStop()方法中释放资源。
  • 前台生存期:onResume()方法和onPause()方法之间。此时活动处于运行状态,可以和用户进行交互。

没提到的onRestart()方法在活动由停止状态变为运行状态之前调用。

储存临时数据

为了在活动被系统回收前存储当前活动的数据,应该重写Activity的onSaveInstanceState()方法,该方法可以保证活动在被回收之前一定会被调用。

在onSaveInstanceState()方法中将需要储存的数据存入onSaveInstanceState()方法的Bundle类型的参数中。 可以通过onCreate()方法的Bundle类型的参数取出之前保存的数据,该参数默认为null,但如果活动被回收之前有调用过onSaveInstanceState()方法,那么该参数就会带有之前保存的数据。

Bundle存数据:putInt(key, value),putString(key, value),...
取数据:getInt(key),getString(key),...

可以和intent结合使用。

活动的启动模式

在AndroidManifest.xml中通过<activity>标签指定android:launchMode属性来选择。

  • standard:默认模式。每次启动都会创建一个新的实例并压入返回栈中。

25eb706d91aa456b87433c1b38b3333e~tplv-k3u1fbpfcp-zoom-in-crop-mark 3024 0 0 0.webp

  • singleTop:启动活动时如果返回栈的栈顶已经时该活动,则直接使用它,不再创建新的活动实例。

6789871c9c2243bc8f5164389c719035~tplv-k3u1fbpfcp-zoom-in-crop-mark 3024 0 0 0.webp

  • singleTask:启动活动时检查返回栈中是否有该活动的实例,若有则直接使用该实例并将其上的所有活动出栈,若没有则创建新的活动实例。

6ee43a9ad8964b36b27425b5f7056708~tplv-k3u1fbpfcp-zoom-in-crop-mark 3024 0 0 0.webp

  • singleInstance:启用一个新的返回栈管理这个活动,解决了共享活动实例的问题。

b738a88819494891adcaa535ee15e27d~tplv-k3u1fbpfcp-zoom-in-crop-mark 3024 0 0 0.webp

参考:
《第一行代码》第二版
developer.android.com/guide/compo…
juejin.cn/post/712271…