美文网首页
Activity生命周期、启动模式

Activity生命周期、启动模式

作者: 二旬一月 | 来源:发表于2020-06-11 15:15 被阅读0次

生命周期

activity生命周期.png
  • 新界面出现之前,上一个先执行上一个界面的onPause(),然后执行新界面的onCreate()
  • onStart 和 onStop 是从是否可见的角度去区分,onResume和onPause从是否在前台区分。
  • 异常情况下的生命周期:
    资源相关的系统配置发生改变,系统在杀死activity的时候回调用onSaveInstanceState()方法对activity的状态进行保存,当activity重建的时候,会调用onRestoreInstanceState(),并把onSaveInstanceState()保存的Bundle作为参数传递过来。官方建议使用onRestoreInstanceState()恢复。
@Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        outState.putString("msg","存了点东西");
        Log.e("MainActivity","onSaveInstanceState");
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.e("MainActivity","onRestoreInstanceState");
        Log.e("MainActivity",savedInstanceState.getString("msg","啥也没有"));
    }

强制竖屏

  • (代码中使用):
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//强制竖屏
  • (固定为垂直方向):
    android:screenOrientation="portrait"
  • (使activity不敏感屏幕朝向的变化):
    android:configChanges="orientation|keyboard|screenSize
    1.不要和screenOrientation一同使用,会降低效率不销毁Activity;
    2.当横竖屏切换的时候会直接调用onCreate方法中的onConfigurationChanged方法,而不是重新执行onCreate方法,如果没有使用这个属性就会重新调用onCreate方法了

启动模式

配置清单文件
<activity>中的launchModel属性控制

  • standard(默认属性)
    系统在启动该 Activity 的任务中创建 Activity 的新实例,并将 intent 传送给该实例。Activity 可以多次实例化,每个实例可以属于不同的任务,一个任务可以拥有多个实例。
  • singleTop
    如果当前任务栈的顶部已经存在activity实例,则不创建新的activity,而是通过掉用onNewIntent()方法传递Intent,如果不在栈顶,则创建新的activity。
  • singleTask
    系统会创建新任务,并实例化新任务的根 Activity。但是,如果另外的任务中已存在该 Activity 的实例,则系统会通过调用其 onNewIntent() 方法将 intent 转送到该现有实例,而不是创建新实例。Activity 一次只能有一个实例存在。
  • singleInstance
    与 "singleTask" 相似,唯一不同的是系统不会将任何其他 Activity 启动到包含该实例的任务中。该 Activity 始终是其任务唯一的成员;由该 Activity 启动的任何 Activity 都会在其他的任务中打开。
    官方实例
    Android 浏览器应用在 <activity> 元素中指定 singleTask 启动模式,由此声明网络浏览器 Activity 应始终在它自己的任务中打开。这意味着,如果您的应用发出打开 Android 浏览器的 intent,系统不会将其 Activity 置于您的应用所在的任务中,而是会为浏览器启动一个新任务,如果浏览器已经有任务在后台运行,则会将该任务转到前台来处理新 intent

使用Intent标记

  • FLAG_ACTIVITY_NEW_TASK
    在新任务中启动 Activity。如果您现在启动的 Activity 已经有任务在运行,则系统会将该任务转到前台并恢复其最后的状态,而 Activity 将在 onNewIntent() 中收到新的 intent。
    这与上一节中介绍的 "singleTask" launchMode 值产生的行为相同。

  • FLAG_ACTIVITY_SINGLE_TOP
    如果要启动的 Activity 是当前 Activity(即位于返回堆栈顶部的 Activity),则现有实例会收到对 onNewIntent() 的调用,而不会创建 Activity 的新实例。
    这与上一节中介绍的 "singleTop" launchMode 值产生的行为相同。

  • FLAG_ACTIVITY_CLEAR_TOP
    如果要启动的 Activity 已经在当前任务中运行,则不会启动该 Activity 的新实例,而是会销毁位于它之上的所有其他 Activity,并通过 onNewIntent() 将此 intent 传送给它的已恢复实例(现在位于堆栈顶部)。注册流程,从结果页面到登录界面的时候,可以使用这个标识。
    launchMode 属性没有可产生此行为的值。
    FLAG_ACTIVITY_CLEAR_TOP 最常与 FLAG_ACTIVITY_NEW_TASK 结合使用。将这两个标记结合使用,可以查找其他任务中的现有 Activity,并将其置于能够响应 intent 的位置。
    只有当 Activity 具有 ACTION_MAIN 和 CATEGORY_LAUNCHER 过滤器时,才应使用 "singleTask" 和 "singleInstance" 这两种启动模式,它们会将 Activity 标记为始终启动任务。

注意事项

activity的singleTask详解.png

清除返回栈

官方文档

intentfilter 匹配规则

activity的启动方式分为显式启动和隐式启动

  1. 显式启动,通过intent方式启动activity
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                startActivity(intent);
  1. 隐式启动,需要匹配IntentFilter中的过滤信息,
  • action 是一个字符串,系统定义了很多字符串,也可以我们自己定义字符串
    规则:必须有一个且action中的字符串值必须一样
  • category
    规则:Intent可以没有category,如果有不管有几个,每个都要和过滤器中的任意一个相同。过滤器中不设置的情况下,系统在调用startActivity和startActivityForResult的时候,会默认在Intent中添加“android.intent.category.DEFAULT”。
  • data
    data由两部分组成 URI 和 mimeType
    mimeType:媒体类型 image/jpeg 、audio/mpeg4-generic、video/*等
    URI:<scheme>://<host>:<port>/ <path> | <pathPattern> | <pathPrefix> |
    例如:
    content://com.example:200/folder/subfolder/tec
    http://www.baidu.com:80/search/info
    scheme和host 是必要的的,<path> 路径 | <pathPattern>可以使用通配符 * 的路径 | <pathPrefix>路径的前缀信息
    可以调用Intent的setDataAndType 对各个参数进行设置。
    intent.setDataAndType(Uri.parse("file://abc"),"image/png");

参考:《Android开发艺术探索》

相关文章

网友评论

      本文标题:Activity生命周期、启动模式

      本文链接:https://www.haomeiwen.com/subject/exajtktx.html