APP启动与退出实验

作者: 猫侠 | 来源:发表于2016-09-06 17:34 被阅读0次

    -退出-

    function exit_1:
    Intent intent = new Intent(MainAct.this,StartAct.class);//跳转到root activity
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//清除root activity之上的所有activity
    intent.putExtra(StartAct.FLAG, StartAct.FLAG_EXIT);//带过去一个标志,在root activity中接收到这个标志时,就finish掉root activity
    startActivity(intent);
    
    function exit_2:
    moveTaskToBack(boolean nonRoot);//当nonRoot=flase时,如果当前activity不是root activity,则无任何效果
    
    function exit_3:
    finishAndRemoveTask();//从SDK21才有这个方法。
    

    两者异同:
    都可以保留进程。
    exit_1,Task中没有activity了,在recent task中会显示黑屏截图,再次启动应用会从root activity开始启动。
    exit_2,Task中保留activity,在recent task中会显示栈顶activity截图,再次启动应用会把Task移到前台。
    从体验上来说,exit_2更好一点,再次启动速度更快。但也意味着占用更多资源。不过支付宝、QQ什么的貌似都这么做。

    -启动-

    这里主要涉及到“初始化操作放在哪里”、“如何保存全局变量”、“APP在后台被回收后再次启动”三个问题。

    function launch_1:

    初始化操作放在自定义Application的onCreate方法中。
    这样做带来的问题是,随着项目增长,引入的第三方库越来越多,一般第三方库都会要求在Application的onCreate方法中初始化,当初始化操作比较耗时的时候,每次启动都会黑屏一段时间,这实际上是Application的onCreate方法正在执行,root activity的onReusme还未执行造成的。

    为了减少黑屏时间,尝试function launch_2:

    放在root activity的onCreate方法中,所谓启动页。一般来说,全局变量都由初始化操作赋值。全局变量保存在Application中,而初始化操作在root activity的onCreate方法中。当用户按HOME键或采用exit_2退出时,Task会移动到后台。当Task因内存紧张而被系统回收时,全局变量也被回收且没有默认的保存方法。

    当再次启动APP时,注意这里有一个天坑!!!

    如果在Manifests文件中设置application标签

    android:theme="@android:style/Theme.Translucent.XXXX"
    

    那么会恢复重建原来所有的Activity,重建次序是从栈顶数第二个Activity到root activity,最后是栈顶的Activity。
    如果设置

    android:theme="@android:style/Theme.Black.XXXX"
    

    那么会只重建原来栈顶的Activity,当按下Back键,从栈顶数第二个Activity被推到栈顶,这个Activity才会重建。
    也就是说,为了给全局变量重新赋值(不然就NullPoint了),必须设置成Translucent。

    然后换一种思路,尝试function launch_3:

    当Task在后台被回收后,再次启动==重启APP。
    为了达到这一目的,需要这样做:
    设置一个标志代表全局变量的状态,如果全局变量是未经过初始化的,那么除了root activity外所有activity都不应该被建立,如果系统想恢复它们,我们就主动finish掉。最后Task中只剩root activity没有被finish,正常执行完onCreate后跳转到新建的main activity。看起来就像重启一样。
    这样做的问题是,finish只有等onCreate方法执行完才会起作用,所以如果在onCreate方法中调用finish之后读取全局变量,仍然会报NullPoint。另外,如果有用到Fragment,事情就变得异常复杂了。

    尝试持久化处理,function launch_4:

    对全局变量持久化处理,或者在new的时候赋初始值。
    这样做的问题是:持久化处理会留下脏数据;初始值不是异步更新的最新数据。

    -额外的-

    一些APP会通过设置Theme来提升体验。

    设置android:theme="@android:style/Theme.Translucent.NoTitleBar",原来的黑屏变为透明;
    设置android:theme="@android:style/Theme.Light.NoTitleBar",原来的黑屏变为白屏;
    他们的区别在初次启动时最容易观察到,比如优酷初次启动会在桌面卡2秒,就是第一种;知乎初次启动会白屏2秒,就是第二种;联通客户端初次启动会黑屏2秒,就是默认的黑屏。

    如果进程中有一些服务,那么服务启动的时候会执行Application的onCreate。

    //To do ……

    alwaysRetainTaskState = true或flase没有区别

    网上说在root activity设置为false,被系统杀死后只保留root activity;设置为true,则保留全部activity。但是我试了试,在这方面没有任何区别。

    -Log- function launch_2 Translucent

    ----正常启动

    Application--onCreate
    root activity--onCreate
    root activity--onStart
    main activity--onCreate
    main activity--onStart
    secondary activity--onCreate
    secondary activity--onStart

    ----Home键大约10s后

    root activity--onStop
    main activity--onStop
    secondary activity--onStop

    ----360一键清理,或内存不足而被回收

    Process--DEAD
    查询Task信息,root activity、main activity、secondary activity都为DETROYED

    ----有守护进程,自动重启

    Application--onCreate
    查询Task信息,root activity、main activity、secondary activity仍为DETROYED

    ----再次启动APP

    main activity--onCreate
    main activity--onStart
    root activity--onCreate
    root activity--onStart
    secondary activity--onCreate
    secondary activity--onStart
    secondary activity--onStop
    secondary activity--onDestroy
    为了secondary activity不destroy,可以在root activity加判断:如果saveInstanceState != null则不跳转到main activity。

    相关文章

      网友评论

        本文标题:APP启动与退出实验

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