Android activity的生命周期、异常情况下的生命周期(恢复Activity数据)、启动模式

Activity的生命周期

Activity类中定义类7个回调方法,覆盖了活动的每个环节。

onCreate()。每个活动必须去重写的方法。这个方法中中完成活动的初始化,比如加载布局,绑定事件。

onStart()。活动有不可见到可见的调用。

onResume()。活动准备和用户交互时调用。此时活动位于返回栈栈顶,并且处于运行状态。

onPause()。这个方法是系统准备去启动或者恢复另外一个活动的时候调用。这个方法里去释放一些消耗CUI的资源。

onStop()。这个方法在活动完全不可见的时候调用。这个方法里可以去做一些不耗时的稍重量级的记得回收工作。

onDestroy()。Activity的即将被销毁。这个方法里做回收工作和释放资源。

onRestar()。重新启动Activity,活动由不可见到可见,从onStop()到onStart()。

Activity异常情况下的生命周期(恢复Activity数据)

(1)资源相关的系统配置发生改变导致Activity被杀死并重新创建

比如当你去改变手机的横竖屏的时候。你会发现你的Activity被重新创建了。

(2)资源内存不足导致优先级低的Activity被杀死。

Activity的优先级从高到低:

(1)前台Activity:正在和用户交互的Activity。

(2)可见非前台Activity:比如这个Activity弹出了个对话框。

(3)后台Activity:已经执行了Stop,但还在活着的Activity。

恢复Activity的数据:

在我们的Activity创建的时候,你必须去重写onCreate()f方法,你会发现这个方法带着参数。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

对这个savedInstanceState这个参数就是这个Activity因异常而被杀死的实例的数据保存。

下面我们创建一个输入框,一个输出框,通过button将数据提交到输出框。然后我们旋转屏幕。你会发现我们输入框帮我们保存了上一个Activity的数据,这是因为Activity帮我们保存一些view级别的数据。但是你会发现输出框的数据就没有保存。

这是旋转屏幕时Activity的生命周期变化。显然我们的Activity被重新创建了。

onSaveInstanceState保存数据和onRestoreInstanceState(Android推荐)或者onCreate中去恢复数据。 

@Override
protected void onCreate(Bundle savedInstanceState) {
    Log.d("mytag", "onCreate");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState != null) {
        Log.d("mytag", "onCreate " + savedInstanceState.getString("Text"));
    }
    editText = findViewById(R.id.editText);
    textView = findViewById(R.id.textView);
}
//Activity因异常关闭,为了在Activity重新启动时保持原有的数据。而进行获取当前数据
@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    //保存数据
    outState.putString("Text",textView.getText().toString());
    Log.d("mytag","onSaveInstanceState");

}

//去恢复数据
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    textView.setText(savedInstanceState.getString("Text"));
    Log.d("mytag","onRestoreInstanceState");
}

这样就实现了数据的保存:

整个操作的过程:你会发现onSaveInstanceState()执行在onStop()之前,onRestoreInstanceState会执行在第二次创建的onResume之前。

Activity的启动模式

(1)standard模式

这是活动的默认启动模式,在不进行显示指定设置的情况下,所有活动都会自动使用这种启动模式。它不会在乎返回栈中是否已经存在这个活动,每当你去启动这个Activity的时候,它就会去创建一个实例并把它压入返回栈栈顶。

特点:需要多次去点击Back键你才能退出当前的Activity。

(2)singleTop模式

<activity android:name=".MainActivity"
    android:launchMode="singleTop">

你会发现第一种模式是不是非常不合理,既然Activity已经处于栈顶,为什么还要去创建它。singleTop从字面意思理解就是单栈顶模式,就是无论你去重复操作了多少次启动Activity。只要你的栈顶已经存在这个Activity的实例它就不会再去创建。当然如果你的Activity不处于栈顶,那么它还是会去创建Activity。

特点:点击一次Back键就可以退出你当前的Activity。

(3)singleTask模式

<activity android:name=".MainActivity"
    android:launchMode="singleTask">

正如你想到的那样这个模式就是如果你的栈中已经存在你将要创建的Activity的实例,那么它将你不会去创建。因为在你创建这个Activity的时候,它会去检测返回栈中是否存在了这个Activity。如果存在那么将会让这个Activity之上所有Activity出栈,让你要创建的Activity处于栈顶位置。

特点:以单个Activity存在,它会去让去让处于自己之上的所有Activity出栈。

(4)singleInstance模式

<activity android:name=".MainActivity"
    android:launchMode="singleInstance">

这个启动模式的特殊在于当你启动该Activity的时候,它会去开启一个新的返回栈,然后在里面去创建一个Activity的实例。如果你使用ActivityFirst去创建一个singleInstance的ActivitySecond,再用ActivitySecond去创建ActivityThird的话。当你在ActivityThird中点击back键,你会发现你去到ActivityFirst而不是ActivitySecond。你再在ActivityFirst中点击back键,你发现你没有退出程序而是来到ActivitySecond,在这里你点击back键才会退出程序。

特点:开启新的返回栈,去创建Activity的实例。

全局管理Activity

public class ActivityCollector {
    
    public static List<Activity> activities = new ArrayList<>();
  
    public static void addActivities(Activity activity){
        activities.add(activity);
    }
    
    public static void removeActivity(Activity activity){
        activities.add(activity);
    }
    public static void finish(){
        for(Activity activity : activities){
            if (!activity.isFinishing()) {
                activity.finish();
            }
        }
        activities.clear();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36607515/article/details/81591251