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

Activity生命周期和启动模式

作者: 从心开始的我 | 来源:发表于2019-05-08 13:22 被阅读0次

    1, Activity 生命周期

    1.1 Activity生命周期图

    如下:


    Activity生命周期流程图.png
    1.2 Activity流程中疑难点
    • 正常流程中,当打开另一个新的Activity或者按下Home键当前Activity会走onPause--onStop,如果新的Activity是透明主题则只会调用onPause不会调用onStop
    • onStart和onStop是从Activity是否可见的角度区分的;onResume和OnPause从界面是否在前台的角度区分的
    • onResume和OnPause时Activity界面可操作,onStart和onStop界面不可操作
    • 如果当前activityA打开新的activityB时执行流程是 A(onPause)--B(onCreate)--B(onStart)--B(onResume)--A(onStop)而不是A(onPause)--A(onStop)......B
    1.3 Activity异常情况

    <1,当activity异常终止时,系统提供了存储和恢复的方法,流程如下


    异常终止流程

    <2,具体实现

    @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putString("test_key","test_value");
        }
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (savedInstanceState != null) {
                String test_value = savedInstanceState.getString("test_key");
            }
        }
    

    <3,系统本身就自动做了一定的恢复工作,比如:保存当前activity视图;textview的内容;listview滚动位置等,这些的实现是因为这些View本身实现了,比如TextView

    onSaveInstanceState()
    onRestoreInstanceState()
    

    异常情况如下

    • 1.3.1 系统配置发生改变导致activity被杀死并重建
      <1. 当手机屏幕方向发生改变时,如果没有进行特殊配置

    如果不想让activity因系统配置发生改变,可如下配置

    <activity
                android:name=".TestActivity"
                //忽略屏幕方向|软键盘隐藏|屏幕尺寸变化
                android:configChanges="orientation|keyboardHidden|screenSize"
                //确定该activity方向为纵向
                android:screenOrientation="portrait"
                />
    
    • 1.3.2 资源内存不足优先级较低的activity被杀死
      <1. 前台activity--正在和用户交互的activity,优先级最高.
      <2. 可见但非前台--如activity上弹出dialog
      <3. 后台activity--如已执行过onStop的activity

    2, Activity 启动模式

    • 基本概念

    任务栈 : 后进先出的栈结构,当创建activity后,系统会把activity放进栈中,当用户按下back键后任务栈中activity会一一回退,直到任务栈中activity被清空,任务栈为空后,系统会回收该任务栈

    • 启动模式

    activity启动模式:
    <1.standard:标准模式
    <2,singleTop:栈顶复用模式
    <3,singleTask:栈内复用模式
    <4,singleInstance:单实例模式

    • 根据activity定制任务栈

    默认新建的activity存放的任务栈是app的包名,但是可以自定义任务栈如下:

    <activity
                android:name="TestActivity"
                android:taskAffinity="com.test.myApp"<这个是包名>
                />
    <activity
                android:name="TestActivity1"
                android:taskAffinity="com.test.myApp_t1"<这个是定制的任务栈名称>
               />
    
    • 注意事项
    1. 启动模式也是针对任务栈而言的,如果是不同的任务栈,诸如singleTop,singleTask,就不再生效
    多任务栈的启动模式
    1. 当我们使用ApplicationContent 去启动activity时,系统会报错
    Calling startActivity() from outside of an Activity  context requires the 
    FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
    

    原因是新建一个activity,没有指定一个任务栈,所以加上FLAG_ACTIVITY_NEW_TASK 之后,指定新建一个任务栈,可以存放activity

    2.1指定activity启动模式
    1. standard(标准模式)
      默认情况下不做任何操作,就是该模式
    2. singleTop(栈顶复用模式)
    1,manifest文件中
    <activity
                android:name="TestActivity"
                android:launchMode="singleTop"
                />
    2,标识位标识
     Intent intent = new Intent(context,TestActivity.class);
     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP );
     startActivity(intent);
    
    1. singleTask(栈内复用模式)
    1,manifest文件中
    <activity
               android:name="TestActivity"
               android:launchMode="singleTask"
               />
    2,标识位标识
    Intent intent = new Intent(context,TestActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
    
    1. singleInstance(单实例模式)
    manifest文件中
    <activity
               android:name="TestActivity"
               android:launchMode="singleTask"
               />
    

    相关文章

      网友评论

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

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