Activity启动模式详解

最近看了一下有关Activity启动模式并介绍setFlag设置启动模式这种情况;我将结合Android开发者平台来梳理启动模式这块的知识。

本文重点

保存Acitivity状态

Activity任务栈常见属性

启动模式

描述onNewIntent()和onConfigurationChanged()

1.保存Activity状态

  • 使用场景
    当前Actvity处于栈顶顶部的时候,系统需要回收内存资源。一定会重建Activity(而不是恢复Activity)。为了避免用户的工作丢失。我们需要主动通过在Activity中实现onSaveInstanceState()回调方法来保存工作。
    保存Activity状态生命周期图
  • 流程解读
    当Activity处于后台的时候会调用onSaveInstance保存当前Activity的状态,系统回收内存资源时,在onCreate或者onRestoreInstanceState恢复当前Activity的状态。
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.e("TAG", "onRestoreInstanceState()");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.e("TAG", "onRestart()");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.e("TAG", "onCreate()");
        setContentView(R.layout.activity_one);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.e("TAG", "onSaveInstanceState()");
        outState.putString("text","触发改变");
    }
按下homne键触发
TAG: onCreate()
TAG: onSaveInstanceState()
TAG: onRestart()
旋转屏幕
TAG: onSaveInstanceState()
TAG: onCreate()
TAG: onRestoreInstanceState()

2.Activity任务栈常见属性

  • taskAffinity
    与Activity有亲和关系的任务;默认清河关系的应用的包名;
  • launchMode
    启动 Activity 的指令。
  • allowTaskReparenting
    当启动 Activity 的任务接下来转至前台时,Activity 是否能从该任务转移至与其有亲和关系的任务 —“true”表示它可以转移,“false”表示它仍须留在启动它的任务处。仅限于standard和singleTop
  • clearTaskOnLaunch
    是否每当从主屏幕重新启动任务时都从中移除根 Activity 之外的所有 Activity —“true”表示始终将任务清除到只剩其根 Activity;“false”表示不做清除。 默认值为“false”。
  • alwaysRetainTaskState
    系统是否始终保持 Activity 所在任务的状态 —“true”表示保持,“false”表示允许系统在特定情况下将任务重置到其初始状态。 默认值为“false”。
  • finishOnTaskLaunch
    每当用户再次启动其任务(在主屏幕上选择任务)时,是否应关闭(完成)现有 Activity 实例 —“true”表示应关闭,“false”表示不应关闭。 默认值为“false”。

3.启动模式

3.1使用功能清单文件

standard:(默认)
Activity默认的启动模式,多次启动形同的Activity都会创建新的实例;被启动的Activity位于启动Activity的任务栈中;如果用ApplicaitonContext去启动standard模式的Activity需要设置FLAG_ACTIVITY_NEW_TASK,否则会报错;
singleTop:
栈顶复用模式;如果待启动的Activity位于栈顶不会创建新的实例并调用onNewIntent()方法;反之会创建新的实例;
singleTask:(具有FLAG_ACTIVITY_CLEAR_TOP属性)
栈内复用模式;在同一个任务栈中只会拥有一个实例对象;如果待启动的Activity在任务栈中已经存在则会调用onNewIntent()方法;
singleInstance:(Flags不具有的模式)
单实例模式;类似于singleTask模式。但是一个栈中只允许存在一个实例对象,如果待启动的Activity在任务栈中已经存在则会调用onNewIntent()方法;

3.2使用Intent标志位

FLAG_ACTIVITY_NEW_TASK:
为Activity指定singleTask启动模式;
FLAG_ACTIVITY_SINGLE_TOP:
为Activity指定singleTop启动模式;
FLAG_ACTIVITY_CLEAR_TOP:(launchMode不具有的模式)
位于该Activity之上的Activity被移除当前栈;
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:
该标记的Activity不会出现在历史Activity的列表中;

注:如果指定 Activity 的启动模式为 "standard",则该 Activity 也会从堆栈中移除,并在其位置启动一个新实例,以便处理传入的 Intent。 这是因为当启动模式为 "standard" 时,将始终为新 Intent 创建新实例。

4.描述onNewIntent()和onConfigureChanged()

onNewIntent()

在singleTop,singleTask,singleInstance再次启动相同Activity会调用。请注意getIntent()仍然返回原始的Intent。你可以使用setIntent(Intent)将它更新。

onConfigurationChanged()

App运行期间,针对配置中R.attr.configChanges属性进行处理会调用onConfigurationChanged()方法。如果未声明将不会调用该方法,系统将停止并重新启动活动。

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容