活动

活动(Activity),是一个应用组件,用于显示界面与用户进行交互。

1.简介

Android系统使用Task(栈)来存储 Activity,采用后进先出原则。

1.活动的启动模式

分为四种启动模式,分别是 "standard"、"singleTop"、"singleTask"、"singleInstance"、

我们需要在清单文件中<activity>标签中的 android:launchMode 属性来配置启动模式,如

<activity android:name=".SecondActivity" android:launchMode="standard" />

(1) standard

这个是默认启动模式。

以这种方式启动活动每次都会创建一个新的实例。

创建的活动都会入栈,并处于栈的顶端位置。

(2)singleTop

当启动活动时发现栈顶端已经是该活动,则直接使用该活动,并调用该实例的onNewIntent()方法向其传送Intent,而不会再创建新的活动实例。 如果该活动不是在栈顶位置时,则还是会创建新的实例。

(3)singleTask

以这种方式启动活动,每次系统都回去返回栈中检查是否存在该活动的实例,如果已经存在则直接使用该实例,并把这个活动之上的所有活动都出栈。如果没有发现则会创建一个新的实例。

(4)singleInstance

指定为singleInstance模式的活动会启用一个新的返回栈来管理这个活动。

保证无论从那个Task启动Activity都这会创建一个Activity实例,并将它假如到新的Task 栈顶。

2.活动的生命周期

activity_lifecycle.png

img

图片来自:菜鸟教程 (http://img.tigeru.cn/usr/images/old/e98491fc-3934-40d2-863d-9d84356400d0.jpg)

  1. 当创建一个活动MainActivity:
08-30 14:54:13.745 3154-3154/? D/MainActivity: onCreate: 
08-30 14:54:13.745 3154-3154/? D/MainActivity: onStart: 
08-30 14:54:13.745 3154-3154/? D/MainActivity: onResume: 
  1. 当从MainActivity 跳转到 SecondActivity
08-30 14:57:44.429 3154-3154/com.tiger.intenttest D/MainActivity: onPause: 
08-30 14:57:44.454 3154-3154/com.tiger.intenttest D/SecondActivity: onCreate: 
08-30 14:57:44.454 3154-3154/com.tiger.intenttest D/SecondActivity: onStart: 
08-30 14:57:44.455 3154-3154/com.tiger.intenttest D/SecondActivity: onResume:
08-30 14:57:45.078 3154-3154/com.tiger.intenttest D/MainActivity: onStop: 

3.从SecondActivity通过Back键返回到 MainActivity

08-30 14:59:53.554 7583-7583/com.tiger.intenttest D/SecondActivity: onPause: 
08-30 14:59:53.556 7583-7583/com.tiger.intenttest D/MainActivity: onRestart: 
08-30 14:59:53.556 7583-7583/com.tiger.intenttest D/MainActivity: onStart: 
08-30 14:59:53.556 7583-7583/com.tiger.intenttest D/MainActivity: onResume: 
08-30 14:59:53.883 7583-7583/com.tiger.intenttest D/SecondActivity: onStop:
08-30 14:59:53.883 7583-7583/com.tiger.intenttest D/SecondActivity: onDestroy: 

3.保存和恢复Activity 状态

比如说有这样一个情况,在MainActivity中有一个EditText,你已经输入的了数据,然后你跳转到SecondActivity中,过了一会由于系统内存不足,MainActivity被回收,那么当我们再返回到MainActivity中时会再创建一个新的ManActivity,我们在EditText输入的内容也会消失。

这时候我们就用到了 onSaveInstanceState() onRestoreInstanceState()

  • onSaveInstanceState()

这个方法在活动被回收之前一定会调用。

通常来说,跳转到其他activity或者是点击Home键都会执行该方法。 还有就是当:锁屏、屏幕方向切换

Activity可以用键值对集合来保存状态信息。这个方法会默认实现保存有关Activity视图层次的状态信息,例如EditText中的文本,或者ListView的滚动位置。

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        Log.d(TAG, "onSaveInstanceState: ");
        outState.putString("data_key",et.getText().toString());
        super.onSaveInstanceState(outState);
    }
  • onRestoreInstanceState()

这个方法只有在活动确实被系统销毁后,才会执行。 另外也可以写在onCreate()方法中,不过需要判断下savedInstanceState是否为Null。

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        Log.d(TAG, "onRestoreInstanceState: ");
        if(savedInstanceState!=null){
          et.setText(savedInstanceState.getString("data_key"));
        }
        super.onRestoreInstanceState(savedInstanceState);
    }

4. Activity的 configChanges

<activity android:name=".MainActivity" android:configChanges="orientation">

通过配置configChanges 属性来避免对应改变之后的Activity 重建,可以用“|”设置多个,常用有:

名称描述
orientation屏幕方向发生了改变
locale位置发生了改变,一般指改变了系统语言
keyboardHidden键盘的可访问性发生了改变,比如调出了键盘

更多请参考:

https://developer.android.com/training/basics/activity-lifecycle/recreating.html

https://developer.android.com/guide/components/activities.html

Last modification:January 14th, 2020 at 07:47 pm