[2018_android_2]Activity之lifecycle_TBD24

[2018_android_2]Activity之lifecycle_TBD25html

参考


感谢各位大牛分享精彩内容,帮助了我快速学习。
Thank Ujava

TBD

  1. [TBD] https://developer.android.google.cn/guide/components/activities/activity-lifecycle.html
  2. [TBD] https://developer.android.google.cn/guide/components/activities/index.html
  3. [TBD] https://developer.android.google.cn/guide/components/activities/state-changes.html
  4. [TBD] https://developer.android.google.cn/guide/components/activities/tasks-and-back-stack.html
  5. [TBD] https://developer.android.google.cn/guide/components/activities/process-lifecycle.html
  6. [TBD] https://developer.android.google.cn/guide/components/activities/parcelables-and-bundles.html
  7. [TBD] https://developer.android.google.cn/guide/components/activities/recents.html
  8. [TBD] http://android-developers.blogspot.com/2011/06/things-that-cannot-change.html
  9. [TBD] https://developer.android.google.cn/guide/topics/manifest/activity-element.html
  10. [TBD] https://developer.android.google.cn/guide/components/intents-filters.html
  11. [TBD] Window、Dialog、Toast和Activity的关系
  12. [TBD] Visible, InvisibleBackground, and Foreground ?
  13. [TBD] Fragment生命周期结合Activity生命周期?
  14. [TBD] Activity的启动过程源码比较复杂,涉及到Instrumentation, ActivityThread and ActivityManagerSercice(AMS)
  15. [TBD1]源码中的红色错误代码是怎么回事
  16. [TBD] 选择1: onPause.
  17. [TBD]保存数据和恢复数据的推荐组合?
  18. [TBD] onSaveInstanceState 中存储数据的大小限制是多少?
  19. [TBD] 关于保存和恢复的层次结构,系统的工做流程:
  20. [TBD] 检查API有没有更新,并对每个属性进行测试 。国内android官网没有搜到 configChanges结果
  21. TBDScreenSize和SmallScreenSize 比较特殊, 行为和编译选项有关,和运行环境无关。
  22. [TBD]方案4:网络请求没有返回以前,不容许方向变化。 返回后,变化方向?
  23. [TBD] 如何模拟内存不足的状况?目前网上的方法都没有效果。
  24. [TBD] Activity的优先级排序?有API callback函数能够调用吗?

环境

Activity生命周期

[TBD] WindowDialogToastActivity的关系 android

正常状况(又称典型状况)下的生命周期

正常状况(又称典型状况)下的生命周期,指的是用户参时,Activity所经历的生命周期改变。
正常状况下的生命周期 ,主要关注生命周期函数的调用顺序,在每一个生命周期要作什么?不能作什么?git

Acivity lifecycle about functions

Acivity lifecycle about functions


[TBD] Visible, InvisibleBackground, and Foreground?
Visible:表示activity可见状态,即activity已经显示出来了。
Invisible:表示activity不可见状态,即activity没有显示出来了。
Background:activity位于后台,即没法与用户交互。
Foreground :activity位于前台,便可以与用户交互。github


Activity lifecycle
Figure 1. A simplified illustration of the activity lifecycle.
Figure 1. A simplified illustration of the activity lifecycle. 网络

https://developer.android.google.cn/guide/components/activities/activity-lifecycle.htmlapp


结合“A simplified illustration of the activity lifecycle”,具体说明。

状况1: A 跳到B,而后B 按导航Back键,返回到A

// A -> B
 D/A: onPause
 D/B: onCreate: 
 D/B: onStart
 D/B: onResume
 D/A: onSaveInstanceState
 D/A: onStop

 // A <- B
 D/B: onPause: 
 D/A: onRestart: 
 D/A: onStart
 D/A: onResume
 D/B: onStop: 
 D/B: onDestroy:

  • [Q] 执行onDestroy()后,未执行完的线程还会继续执行吗?

[A] 继续执行,直到执行完毕,或者当app进程被杀死,未执行完的线程被强制中止。 ide

执行onDestroy()后,未执行完的线程,继续执行。函数

// Test on Nenux 5X, Android 8.0, API 26
// A -> B,而后A <- B后,
// 执行onDestroy()后,未执行完的线程还会继续执行:  
D/AActivity: onStart
D/AActivity: onResume
D/BActivity: run: i=9
D/BActivity: onStop: 
D/BActivity: onDestroy: 
I/zygote64: Do partial code cache collection, code=23KB, data=28KB
I/zygote64: After code cache collection, code=23KB, data=28KB
I/zygote64: Increasing code cache capacity to 128KB
D/BActivity: run: i=10
D/BActivity: run: i=11
D/BActivity: run: i=12

当用户从Recent list close app,未执行完的线程被强制中止,由于整个app进程被杀死,分配的全部资源被OS回收。工具

用户从Recent list close app
D/BActivity: run: i=590
D/BActivity: run: i=591
D/BActivity: run: i=592

// 用户从Recent list close app,未执行完的线程中止运行
D/AActivity: onPause
D/AActivity: onSaveInstanceState
D/AActivity: onStop
D/BActivity: run: i=593

[TBD] Fragment生命周期结合Activity生命周期?


状况2:A -> B, B -> A, A back to Homescreen

// Open app, A is mainActivity
 D/A: onCreate: 
 D/A: onStart
 D/A: onResume

// A -> B
 D/A: onPause
 D/B: onCreate: 
 D/B: onStart
 D/B: onResume
 D/A: onStop

// A <- B
 D/B: onPause: 
 D/A: onRestart: 
 D/A: onStart
 D/A: onResume
 D/B: onStop: 
 D/B: onDestroy: 

// Press back , A -> Homescreen, exit A and APP
D/A: onPause
D/A: onStop
D/A: onDestroy

对于单个Activity,such as A:

  • 第一次启动时, onCreate -> onStart -> onResume.
  • 跳转到其余activity时,onPause -> onStop.
  • 再次回来时,onRestart -> onStart -> onResume.
  • 按Back键退出时,onPause -> onStop -> onDestroy
  • 从Activity实例上来看,onCreate和onDestroy()是配对的,表明Activity的建立与销毁,只能调用一次。
  • 从Activity 是否可见来看,onStart()与onStop()是配对的,这两个方法可能被调用屡次。
  • 从Activity是否前台来看,onResume()与onPause()是配对的,这两个方法可能被调用屡次。
  • onSaveInstanceState 不是生命周期函数。

状况3:A -> Float / Translucent B, Float / Translucent B -> A, A back to Homescreen

  • Q: 打开Float(悬浮) Activity ,translucent(半透明) Activity 与普通Activity的生命周期区别?

与启动 normal Activity相比,启动Float Activity或Translucent时,A 仅仅执行onPause,不执行onStop.
Back to A时,A 不执行OnStart,仅仅执行onResume.

Note: 没有特殊说明,要跳转的Activity是普通Activity,不是Float/Translucent activity。

// Open app, A is mainActivity
 D/A: onCreate: 
 D/A: onStart
 D/A: onResume

 // A -> TranslucentB
 D/A: onPause
 D/TranslucentB: onCreate: 
 D/TranslucentB: onStart
 D/TranslucentB: onResume

// A <- TranslucentB
 D/TranslucentB: onPause: 
 D/A: onResume
 D/TranslucentB: onStop: 
 D/TranslucentB: onDestroy: 

// Press back , A -> Homescreen, exit A and APP
 D/A: onPause
 D/A: onStop
 D/A: onDestroy
// Open app, A is mainActivity
 D/A: onCreate: 
 D/A: onStart
 D/A: onResume

// A -> FloatB
D/A: onPause
D/FloatB: onCreate: 
D/FloatB: onStart
D/FloatB: onResume

// A <- FloatB
D/FloatB: onPause: 
D/A: onResume
D/FloatB: onStop: 
D/FloatB: onDestroy: 

// Press back , A -> Homescreen, exit A and APP
 D/A: onPause
 D/A: onStop
 D/A: onDestroy

状况4:A -> Screen OFF -> Screen ON

跟跳转到本身 app的其余Activity是同样的。

// Open app, A is MainActivity
 D/A: onCreate: 
 D/A: onStart
 D/A: onResume
 
// Screen OFF ,由于跳转到其余activity(Locks Screen app的Activity)
 D/A: onPause
 D/A: onSaveInstanceState
 D/A: onStop

// Screen ON
 D/A: onRestart: 
 D/A: onStart
 D/A: onResume

onStart和onStop,onResume和onPause有什么实质不一样吗?

这两个配对的回调分别表明不一样的意义。
onStart和onStop是从Activity是否可见角度来回调。
onResume和onPause是从Activity是否位于前台角度来回调。
除了这种区别,在实际使用当中没有其余明显区别。


Q:为何onPause和onStop不能作耗时操做,只能作轻量级操做?

A:

  • 由于以后Old activity onPause()执行完后,才能执行New activity onResume()。
  • onPause和onStop都不能执行耗时操做,尤为是onPause。应尽可能在onStop中作操做,从而使得新的Activity尽快显示出来并切换到前台。

Q: A -> B, B的onResume()和A 的onPause哪一个先执行?

  • Old activity 先onPause, New activity onCreate -> onStart -> onResume,Old Activity 再onStop。

从生命周期函数调用顺序角度, 验证。

// A -> B
 D/A: onPause
 D/B: onCreate: 
 D/B: onStart
 D/B: onResume
 D/A: onStop

从源码上, 验证。

[TBD] Activity的启动过程源码比较复杂,涉及到Instrumentation, ActivityThread and ActivityManagerSercice(AMS)。

如何简单理解?
启动Activity的请求会由Instrumentation来处理, 而后Instrumentation经过Binder 向AMS发送请求,AMS内部维护一个ActivityStack并负责栈内的Activity的状态同步,AMS经过ActivityThread去同步Activity的状态而完成生命周期方法的调用。

图Instrumentation经过Binder 向AMS发送请求:

图Instrumentation经过Binder  向AMS发送请求


[TBD1]源码中的红色错误代码是怎么回事


图ActivityStack.java - resumeTopActivityInnerLocked()
ActivityStack.java - resumeTopActivityInnerLocked(

ActivityStackSupervisor.java - realStartActivityLocked()
IApplicationThread thread ,实现是ActivityThread中的ApplicationThread。
这段代码其实是调用ApplicationThread中的scheduleLaunchActivity(),scheduleLaunchActivity()最终完成新Activity的onCreate,onStart,onResume。

图ActivityStackSupervisor.java - realStartActivityLocked()
源ActivityStackSupervisor.java - realStartActivityLocked()

图 源码ApplicationThread.java # scheduleLaunchActivity()
源码ApplicationThread.java # scheduleLaunchActivity()

验证 onPause和onStop都不能执行耗时操做,尤为是onPause。应尽可能在onStop中作操做,从而使得新的Activity尽快显示出来并切换到前台。

A -> B ,A 中onStop模拟耗时操做:开启一个Thread,打印从1~1000的整数,每次打印一个整数,Thread.sleep 1 second.
A 在onPause中模拟耗时操做也是同样的。由于是在一个子线程里面执行,对生命周期函数的执行没有影响。

@Override
    protected void onStop() {
        Log.d(TAG, "onStop");
        // 不管super.onStop() 先后调用testIfInOnStopCanDoHeavyWork,log都是同样的。
        testIfInOnStopCanDoHeavyWork();
        super.onStop();
        // testIfInOnStopCanDoHeavyWork();
    }

 private void testIfInOnStopCanDoHeavyWork() {
        if (null != counter) {
            return;
        }
        counter = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 1000; i++) {
                    Log.d(TAG, "run: i=" + i);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        counter.start();
    }
//Open app, A is Main activity.
 D/A: onCreate
 D/A: onStart
 D/A: onResume

// A -> B
 D/A: onPause
 D/B: onCreate: 
 D/B: onStart
 D/B: onResume
 D/A: onStop
 D/A: run: i=0
 D/A: run: i=1
 D/A: run: i=2
 D/A: run: i=3
 D/A: run: i=4
 D/A: run: i=5
 D/A: run: i=6
 D/A: run: i=7
 D/A: run: i=8
 D/A: run: i=9
 D/A: run: i=10
 D/A: run: i=11
 D/A: run: i=12
 D/A: run: i=13
 D/A: run: i=14
 D/A: run: i=15
 D/A: run: i=16
 D/A: run: i=17
 D/A: run: i=18
<video id="video" controls="" preload="none" poster="http://media.w3.org/2010/05/sintel/poster.png">
      <p>Check if onStop can do heavy work. </p>
      <source id="mp4" src="https://yingvickycao.github.io/img/android/app_component/activity/life_cycle/chec_if_can_do_heavy_work_in_onStop_4_app.mp4" type="video/mp4">
      <source id="mp4" src="https://yingvickycao.github.io/img/android/app_component/activity/life_cycle/chec_if_can_do_heavy_work_in_onStop_4_logcat.mp4" type="video/mp4">
    </video>

Check if onStop can do heavy work.

Check if onStop can do heavy work.

异常状况下的生命周期

异常状况下的生命周期,指的是Activity被系统回收或者因为当前设备的Configuration改变时,致使Activity被销毁所经历的生命周期改变。

何时回出现异常状况下的生命周期?

  • 当资源相关的系统配置发生改变,Activity被杀死。
  • 当系统内存不足时,Activity可能被杀死。

状况1: 当资源相关的系统配置发生改变,致使Activity被杀死并从新建立。

TBD[2], 了解系统的资源加载机制
把图片放入drawable目录后,经过Resource去获取图片。为了兼容不一样设备,可能须要在其余目录防止不一样的图片:drawable-mdpi,drawable-hdpi,drawable-land等。 layout也是相似:layout,layout-large,layout-land等。
当app启动时,系统会根据当前设备的状况去加载合适的Resource资源,例如横屏和竖屏分别拿landscape和portrait状态下的资源:layout、图片.... 。
当旋转屏幕,因为系统配置发生了改变,在默认状况下,Activity 会被销毁并从新建立。 也能够阻止系统从新建立Activity。

默认状况下,Activity 会被销毁并从新建立。

打开 auto-ratate模式

<!--  activity没有设置跟资源配置相关的属性  -->
        <activity android:name=".app_component.activity.lifecycle.A">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>

系统的资源加载机制

layout文件夹包含 landscape(横屏)和portrait(竖屏)状态的layout。
layout-landscape仅仅包含landscape状态的layout。
layout-portrait仅仅包含portrait状态的layout。


//Open app, A is Main activity.
D/A: onCreate: 
D/A: onStart
D/A: onResume

// 旋转屏幕 
D/A: onPause
D/A: onSaveInstanceState
D/A: onStop
D/A: onDestroy
D/A: onCreate: 
D/A: [onCreate]restore extra_test:test
D/A: onStart
D/A: [onRestoreInstanceState]restore extra_test:test
D/A: onResume

onSaveInstanceState and onRestoreInstanceState 执行顺序?

  • onSaveInstanceState 在onPause以后,onStop()以前执行。
  • onRestoreInstanceState 在onStart以后, onResume以前执行。

系统只在Activity异常终止的时候才会调用onSaveInstanceState与onRestoreInstanceState来储存和恢复数据,其余状况不会触发这个过程。可是按Home键或者启动新Activity仍然会单独触发onSaveInstanceState的调用:由于用户可能再也不回来了,要作现场保护。

Recreate activity after destroyed by android os

如何恢复以前保存的使用?

如何保存数据:
    • [TBD] 选择1: onPause.
    • 选择2:onSaveInstanceState。
    @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            Log.d(TAG, "onSaveInstanceState");
            outState.putString(INSTANCE_STATE_KEY, "test");
        }
    如何恢复数据?
    • 选择1: onCreate
    • 选择2: onRestoreInstanceState

    二者的区别:
    若是是正常启动, onCreate的参数savedInstanceState = null,必须判断是否为null。

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.d(TAG, "onCreate: ");
            
            setContentView(R.layout.activity_app_component_activity_lifecycle_a_layout);
            if (savedInstanceState != null) {
                String test = savedInstanceState.getString(INSTANCE_STATE_KEY);
                Log.d(TAG, "[onCreate]restore extra_test:" + test);
            }
        }
    
     @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {
            super.onRestoreInstanceState(savedInstanceState);
            String test = savedInstanceState.getString(INSTANCE_STATE_KEY);
            Log.d(TAG, "[onRestoreInstanceState]restore extra_test:" + test);
        }

    [TBD]保存数据和恢复数据的推荐组合?

    onSaveInstanceState 保存数据,onRestoreInstanceState 恢复数据。
    缘由: OS只有在Activity异常终止时才会调用onSaveInstanceState 和 onRestoreInstanceState。


    [TBD] onSaveInstanceState 中存储数据的大小限制是多少?

    在onSaveInstanceState和onRestoreInstanceState中,系统自动会作View的相关状态的保存和恢复工做,好比 文本框的数据、ListView滚动位置等。
    具体特定View能恢复什么数据,要View的onSaveInstanceState和onRestoreInstanceState源码。
    VIew.java实现了onSaveInstanceState和onRestoreInstanceState函数,它的派生类会重写这两个函数实现保存和恢复特定数据。


    [TBD] 关于保存和恢复的层次结构,系统的工做流程:

    采用委托思想,上层委托下层、父容器委托子元素去处理一个事情。
    委托思想在Android 有不少应用,View的绘图过程、事件分发等采用相似的思想。

    Step1: Activity 被意外终止,Activity会调用onSaveInstanceState保存数据,而后Activity会委托Window去保存数据。
    Step2: Window 委托它上面的顶级容器去保存数据。顶级容器是一个ViewGroup,通常来讲多是DecorView。
    Step3: 顶级容器再去一一通知它的子元素来保存数据。
    经过委托,完成整个数据保存工程。


    configChanges的含义

    configChanges

    [TBD] 检查API有没有更新,并对每个属性进行测试 。国内android官网没有搜到 configChanges结果

    • 常见的3个选项:local、orientation和keyboardHidden。
    • TBDScreenSize和SmallScreenSize 比较特殊, 行为和编译选项有关,和运行环境无关。

    Q:如何不转屏,或者转屏时不销毁?

    方式1:[容许转屏,但不销毁Activity]

    经过为Activity设置configChanges属性,当屏幕旋转时Activity不销毁并从新建立。
    A 添加 android:configChanges="orientation"属性,当屏幕旋转时,A不会从新建立, 不会调用onSaveInstanceState 和 onRestoreInstanceState来保存和恢复数据,仅执行onConfigurationChanged

    AndroidManifest.xml

    <activity
                android:name=".app_component.activity.lifecycle.A"
                android:configChanges="orientation"/>

    A.java

    @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            // 2 == ORIENTATION_LANDSCAPE
            // 1 == ORIENTATION_PORTRAIT
            // 0 == ORIENTATION_UNDEFINED
            Log.d(TAG, "onConfigurationChanged, newOrientation:" + newConfig.orientation);
        }
    D/A: onConfigurationChanged, newOrientation:1
    D/A: onConfigurationChanged, newOrientation:2
    D/A: onConfigurationChanged, newOrientation:1
    方案2:[不转屏]

    经过设置setRequestedOrientation设置为横屏或竖屏。
    这种方式,屏幕不会旋转,什么函数也不会调用,Activity不销毁并从新建立。

    DisableRotateActivity.java

    @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            setTitle(R.string.activity_disable_Rotate);
            super.onCreate(savedInstanceState);
    
            // 禁止横竖屏转换,设置屏幕方向为竖屏
            //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            // 禁止横竖屏转换,设置屏幕方向为横屏
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
    方案3:经过设置setRequestedOrientation设置为手机时竖屏,屏幕不会旋转,什么函数也不会调用; 平板时,容许转屏,容许从新建立Activity。

    DisableRotateActivity.java

    @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            setTitle(R.string.activity_disable_Rotate);
            super.onCreate(savedInstanceState);
    
            // 手机时,竖屏; 平板时,容许转屏,容许从新建立Activity
            boolean isTablet = isTablet();
            Log.d(TAG, "onCreate: isTablet=" + isTablet);
            setRequestedOrientation(isTablet ? ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    
        private boolean isTablet() {
            String screen = getString(R.string.screen);
            Log.d(TAG, "isTablet: screen=" + screen);
            return ("xlarge-land".equalsIgnoreCase(screen) || "xlarge".equalsIgnoreCase(screen));
        }
    // 启动,就是横屏
    D/DisableRotateActivity: isTablet: screen=xlarge-land
    D/DisableRotateActivity: onCreate: isTablet=true
    D/DisableRotateActivity: onStart
    D/DisableRotateActivity: onResume
    
    // 横屏 -> 竖屏
    D/DisableRotateActivity: onConfigurationChanged: 1
    D/DisableRotateActivity: onConfigurationChanged: ORIENTATION_PORTRAIT
    D/DisableRotateActivity: onPause
    D/DisableRotateActivity: onSaveInstanceState
    D/DisableRotateActivity: onStop
    D/DisableRotateActivity: onDestroy
    D/DisableRotateActivity: isTablet: screen=xlarge
    D/DisableRotateActivity: onCreate: isTablet=true
    D/DisableRotateActivity: onStart
    D/DisableRotateActivity: [onRestoreInstanceState]restore extra_test:test
    D/DisableRotateActivity: onResume
    
    // 竖屏 -> 横屏
    D/DisableRotateActivity: onConfigurationChanged: 2
    D/DisableRotateActivity: onConfigurationChanged: ORIENTATION_LANDSCAPE
    D/DisableRotateActivity: onPause
    D/DisableRotateActivity: onSaveInstanceState
    D/DisableRotateActivity: onStop
    D/DisableRotateActivity: onDestroy
    D/DisableRotateActivity: isTablet: screen=xlarge-land
    D/DisableRotateActivity: onCreate: isTablet=true
    D/DisableRotateActivity: onStart
    D/DisableRotateActivity: [onRestoreInstanceState]restore extra_test:test
    D/DisableRotateActivity: onResume

    [TBD]方案4:网络请求没有返回以前,不容许方向变化。 返回后,变化方向?


    状况2: 当OS内存不足,致使低优先级的Activity被杀死。

    [TBD] 如何模拟内存不足的状况?目前网上的方法都没有效果。

    [TBD] Activity的优先级排序?有API callback函数能够调用吗?

    Activity的优先级按照从高到低的顺序,分为3种:

    1. Foreground Activity(前台Activity):优先级最高。用户正在和用户交互。执行完了onResume。
    2. Visible but background Activity(可见但非前台Activity): Activity可见但位于后台没法和用户直接交互。 例如:Activity弹出一个对话框。
    3. Background Activity(后台Activity):已经被暂停的Activity。好比执行了onStop,优先级最低。

    当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在的进程,并在后面调用onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。

    当app 没有四大组件在执行,进程会很快被OS(系统)杀死。

    如何下降app 进程被杀死的几率?

    • 将后台工做放入Service来保证进程有必定的优先级,在必定程度上能下降被OS杀死的几率。
    • [PASS]事实上,在Android 8.0 API26 上,app 进入background,而后开几个耗内存的app,好比Chrome、Photo,过几分钟Activity 被杀死,甚至app进程被杀死。

    内存资源很低时,当把app放在后台,MainActivity就被销毁了,可是app进程还在。过了2分钟,app进程也被杀死了。

    • [PASS]OS >= Android 6.0 API 24 时,之前Service 保活的方法将再也不有效。
    • [PASS]OS < Android 6.0 API 24, 之前Service 保活的方法将有效。
    • [PASS]在OS内存不足时,可能致使低优先级的Activity被杀死但app进程还活着,也可能整个app进程被OS杀死。

    状况3: Use Settings -> AppsInfo app to force app

    Force Stop,app 进程被杀死时,not invork any lifecycle function。
    从Recent list中重启qpp,app进程?不是原来的进程号,是一个新的进程。

    // Open app, A is mainActivity
    D/A: onCreate: 
    D/A: onStart
    D/A: onResume
    
    // A -> B
    D/A: onPause
    D/B: onCreate: 
    D/B: onStart
    D/B: onResume
    D/A: onStop
    
    // B -> HomeScreen -> Settings -> AppsInfo
    D/B: onPause: 
    D/B: onSaveInstanceState
    D/B: onStop: 
    
    // In AppsInfo app, force Stop My app. app 进程已经杀死了。
    // No log . So not invork any lifecycle function.
    
    // Reopen app from  recent list, 从新重启qpp, app进程不是原来的进程,是一个新的进程。
    D/A: onCreate: 
    D/A: onStart
    D/A: onResume
    <video id="video" controls="" preload="none" poster="http://media.w3.org/2010/05/sintel/poster.png">
          <p>force Stop My app </p>
          <source id="mp4" src="https://yingvickycao.github.io/img/android/app_component/activity/life_cycle/force_stop_app_video_1.mp4" type="video/mp4">
          <source id="mp4" src="https://yingvickycao.github.io/img/android/app_component/activity/life_cycle/force_stop_app_video_2.mp4" type="video/mp4">
        </video>

    Force app
    Force app
    Force app

    force Stop My app
    force Stop My app

    相关文章
    相关标签/搜索