对于一个ActivityA调用到ActivityB的正常流程,ActivityB的onResume会等待ActivityA的oPause执行后才会继续。这也意味着,尽量把操作放到onStop而不是onPause中执行
对于Activity异常终止的情况,会调用onSaveInstanceState与onRestoreInstanceState方法。其中onSaveInstanceState方法会在onStop之前调用,可能在onPause之前,也可能在onPause之后。而onRestoreInstanceState则是在onStart之后调用
正常情况下,是不会调用这两个方法的。而异常情况也包括系统配置发生改变的时候(如旋转屏幕的时候)。
若想要在系统配置未改变的情况下不重启Activity,则需要在AndroidMenifest中为Activity加android:configChanges的属性,如
android:configChanges="orientation|keyboardHidden"
该选项会导致发生屏幕旋转或者键盘的可访问性发生了改变(如用户调出了键盘)时,系统不重启Activity,而是去调用Activity里的onConfigurationChanged方法。
有四种launchmode:standard、singleTop、singleTask、singleInstance
若Activity不会被重新创建,则都会调用到onNewIntent之后,再调用onResume
singleTask自带clearTop的效果,singleInstance相当于在singleTask的基础上,新增了该activity只单独存在于一个栈中
TaskAffinity属性,也是在Androidmanifest中的activity声明的,用于标识了一个Activity所需的任务栈的名字,默认情况下为自己的包名
allowTaskReparenting属性,用于表示该activity是否可以变换任务栈,如应用A启动到应用B中的ActivityC,且应用B的ActivityC中声明了allowTaskReparenting为true。启动了ActivityC后,此时它们会在同一个任务栈中。此时按Home键回到首页之后,再进入应用B,此时应该会有一个新的任务栈,C从应用A的栈中移到了应用B的栈中
有两种方式声明launchMode,分别是在AndroidMenifest中声明(无法设置clearTop),和在intent中addFlags(无法设置成singleInstance),两种同时存在时,intent的方法会优先级高于AndroidMenifest
在隐式调用中设置的过滤信息,Intent调用时,需要同时匹配其中的action、category、data才能够启动该activity
同时一个Activity可以同时有多个IntentFilter,只需要匹配上一个IntentFilter即可
其中action只需要匹配上一种即可,category则是需要Intent中的所有category都在IntentFilter中存在才可以,且startActivity或者startActivityForResult调用时,默认Intent都会有android.intent.category.DEFAULT这个category
而data的匹配方式则与action类似
data由mimeType和URI组成,mimeType是媒体类型,如“video/*”或者”image/jpeg”
而URI结构如下:
content://com.example.project:200/folder/subfolder/etc
SCHEME:URI的模式,如content,默认为content和file,即若Intent没有指定URI,则Intent中的URI部分需要为content或者file才可以匹配
HOST:如com.example.project,主机名
PORT:如200,端口号
PATH、pathPattern、pathPrefix表示路径信息
注意Intent中的setData和setType方法均会导致另一个方法设下去的值为null,所以一般都用setDataAndType来设置
intent.setDataAndType(Uri.parse("file://abs"),"image/png");
最后是隐式调用的tips,为了防止没有对应的activity导致程序崩溃,可以在startActivity之前调用PackageManager的relolveActivity方法或者intent的resolveActivity方法,若不为null,则表示识别到了匹配过滤的优先级最高的Activity