Android艺术开发探索|重点提炼一:Activity

好记性不如烂笔头,记录发现问题

一、正常情况下的生命周期

  • onCreate():表示Activity正在被创建
  • onRestart():表示Activity正在重新启动
  • onStart():Activity正在被启动,Activity可见却还没出现在前台。
  • onResume():Activity已经可见,并且出现在前台。
  • onPause():Activity正在停止。
  • onStop():Activity即将停止。
  • onDestroy():Activity即将被销毁。

问题一:onStart和onResume、onPause和onStop的描述差不多,他们有何区别?
onStart和onStop是从Activity是否可见这个角度来回调,onResume和onPause是从Activity是否出现在前台的角度回调的。即onStart表示Activity可见却还没出现在前台,onResume表示已经位于前台,可以和用户交互。onPause则表示Activity不位于前台,但是还可见,onStop表示已经从前台消失,不可见了。

上图所示,正常情况下的生命周期如下:
1、第一次启动onCreate -> onStart -> onResume.
2、用户打开新的Activity或者切换到桌面时:onPause -> onStop。如果新的Activity为透明时不会回调onStop。
3、用户回到原来的Activity:onRestart -> onStart ->onResume。
4、用户back回退时:onPause -> onStop -> onDestroy。

注:onPause中不能做重量级的操作,如耗时操作,因为在打开新的Activity时,旧的Activity的onPause执行完,新的Activity才能onResume。

二、异常情况下的生命周期

2.1、资源相关的系统配置发生改变时导致Activity被销毁并重建(如屏幕横竖屏)

Activity在异常情况下被终止,系统会调用onSaveInstanceState方法(onStop被调用之前)来保存当前的状态。保存后,Activity在被重新创建的时候,系统会调用onRestoreInstanceState(onStart被调用之后)把onSaveInstanceState所保存的Bundle对象作为参数传给onRestoreInstanceState和onCreate方法,那么就可以取出之前的数据并恢复。

2.2、内存不足优先级低的Activity被销毁

这类异常情况的数据存储和数据恢复与上面2.1相同。Activity优先级排序:
前台Activity > 可见但非前台Activity > 后台Activity

问题二:如何保证后台工作不那么容易被杀死?
将后台的工作放到Service中,保证进程有一定的优先级。

问题三:如何保证Activity在系统配置发生改变后不重新创建?
给Activity指定configChanges属性。如不想Activity在屏幕旋转的时候重建,就可以给configChanges添加orientation属性值。

 <activity android:name=".MainActivity"
        android:configChanges="orientation">
       <intent-filter>
            <action android:name="android.intent.action.MAIN" />
           <category android:name="android.intent.category.LAUNCHER" />
     </intent-filter>
 </activity>

三、Activity的启动模式

3.1、LunchMode

  • standard:标准模式,也是系统的默认模式,每次启动Activity都会创建一个实例,不管这个实例是否存在。
  • singleTop:栈顶复用模式,第一种情况如果新的Activity位于栈顶,那么Activity不会被重新创建,同时他的onNewIntent会被回调。第二种情况如果Activity的实例已经存在在任务栈中,但不是位于栈顶,那么Activity还是会被重新创建。
  • singleTask:栈内复用,只要Activity在任务栈中,那么不管启动多少次Activity都不会被重建实例,系统也会回调onNewIntent方法。如果没有任务栈,就先创建一个栈然后创建Activity的实例并放入栈中。如果存在任务栈,但是Activity的实例不在栈中,则需要创建实例并压入栈中;如果Activity的实例存在,那么就会把实例调到栈顶,并调用他的onNewIntent方法。
    另外值得注意的是,singleTask模式默认具有clearTop的效果,打个比方,当前任务栈有ABCD四个实例,A在栈底,D在栈顶,如果启动B,会把B调到栈顶并调用onNewIntent方法,同时会导致CD全部出栈。
  • singeInstance:单实例模式,具有singleTask模式的所有特性,另外就是这种模式的Activity只能单独的位于一个任务栈中。

3.2、主要的Flags

  • FLAG_ACTIVITY_NEW_TASK:为Activity指定singleTask模式。
  • FLAG_ACTIVITY_SINGLE_TOP:为Activity指定singleTop模式。
  • FLAG_ACTIVITY_CLEAR_TOP:具有此标记的Activity,当它启动时,在同一任务栈所有位于它上面的Activity都要出栈。
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有这个标记的Activity不会出现在历史Activity的列表中。

推荐阅读:
从Log中看View的事件分发机制
Android自定义View_BitmapShader实现望远镜效果

公众号:小猿说,免费分享Android,Python,Java等学习视频教程。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章