Android开发艺术探索:Activity的生命周期和启动模式

  决定把读的每一本书都做一下读书笔记或者感悟,技术的或者非技术的,一方面方便以后复习查阅,另一方面也能记录自己进步的脚印,2016了,大家要继续努力哈!这本是一本Android开发比较进阶的书籍,建议有一定Android开发基础知识后再进行阅读。

典型情况下Activity的生命周期

正常情况下的生命周期

onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy

当从其他Activity切换到已经存在的Activity时,就会调用

onRestart -> onStart -> onResume

应该避免在onPause和onStop中做耗时操作,因为执行完onPause之后新的Activity才能执行onStop和onResume,耗时操作会拖慢进入下一个Activity的速度。

当Activity从A调用startActivity启动B的时候,生命周期会有重叠的现象,通过源码分析执行顺序是这样的:

Activity Action
A onPause
B onCreate
B onStart
B onResume
A onStop (当A不可见的情况下)

如果您必须在第一个 Activity 停止时向数据库写入数据,以便下一个 Activity 能够读取该数据,则应在 onPause() 而不是 onStop() 执行期间向数据库写入数据。尽量避免在onPause里做CPU密集型的任务,会导致进入第二个Activity的速度变慢。

异常情况下Activity的生命周期

Activity的启动模式

因为非Activity的Context里面并没有保存所谓的任务栈的相关信息,需要加上FLAG_ACTIVITY_NEW_TASK_FLAG的标志位,这时候实际上是以singleTask的模式来启动的。

启动模式和TaskAffinity更详细的实例可以参考这篇博文

启动模式的另外一种设置方法

就是通过给Intent设置标志位,这种方法的优先级高于在AndroidManifest.xml中设置。

第一种方式无法设置FLAG_CLEAR_TOP的效果,第二种方式无法设置SingleInstance:

IntentFilter匹配规则

用于过滤隐式的Intent,过滤的内容有action,category,data

data的属性:scheme,host,port,path,pathPattern,pathPrefix
URI结构:

   <scheme>://<host>:<port>/[<paht>|<pathPrefix>|<pathPattern>]
 <intent-filter>
    <data android:mimeType="image/*" />
 </intent-filter>

匹配规则为所有图片类型,虽然没有指定URI,但是有默认值content 、file

intent.setDataAndType(Uri.parse(“file://abc”),”image/png”);

另外,如果Intent要指定完整的Intent的时候,不能单独调用setData或者setType ,查看源码可以发现这两个方法都会互相清空data的某些属性。

如果我们匹配不了隐式Intent,那么调用startActivity的时候就会报错,我们可以使用PackageManager或者Intent中的的resolveActivity(Intent intent,int flag)方法,匹配最佳的Intent,如果匹配不了就会返回null

flags:The most important is MATCH_DEFAULT_ONLY, to limit the resolution to only those activities that support the CATEGORY_DEFAULT.

 <action android:name="android.intent.action.MAIN" />
 <category android:name="android.intent.category.LAUNCHER" />