Acitivity作为Android四大组件之首,在Android app开发过程当中尤其重要,这里咱们对Activity的生命周期
,启动模式
Flags
异常退出的状态保存
,状态恢复
,显式启动
,隐式启动
以及Activity的隐式启动
中action
category
data
的过滤规则整理总结。java
分别覆写Activity生命周期中几个重要的方法:android
protected void onCreate(Bundle savedInstanceState) { Log.i("target","Activity onCreate"); } protected void onStart() { Log.i("target","Activity onStart"); } protected void onRestart() { Log.i("target","Activity onRestart"); } protected void onResume() { Log.i("target","Activity onResume"); } protected void onPause() { Log.i("target","Activity onPause"); } protected void onStop() { Log.i("target","Activity onStop"); } protected void onDestroy() { Log.i("target","Activity onDestroy"); }
正常状况下生命周期从进入activity到按下回退键退出activity
浏览器
com.example.root.activitylifecycle I/target: Activity onCreate com.example.root.activitylifecycle I/target: Activity onStart com.example.root.activitylifecycle I/target: Activity onResume com.example.root.activitylifecycle I/target: Activity onPause com.example.root.activitylifecycle I/target: Activity onStop com.example.root.activitylifecycle I/target: Activity onDestroy
屏幕灭掉app
com.example.root.activitylifecycle I/target: Activity onCreate com.example.root.activitylifecycle I/target: Activity onStart com.example.root.activitylifecycle I/target: Activity onResume com.example.root.activitylifecycle I/target: Activity onPause com.example.root.activitylifecycle I/target: Activity onStop
能够看到并无执行onDestroy方法,接下来点亮屏幕
ide
com.example.root.activitylifecycle I/target: Activity onRestart com.example.root.activitylifecycle I/target: Activity onStart com.example.root.activitylifecycle I/target: Activity onResume
跳转到其余activitythis
com.example.root.activitylifecycle I/target: Activity onCreate com.example.root.activitylifecycle I/target: Activity onStart com.example.root.activitylifecycle I/target: Activity onResume com.example.root.activitylifecycle I/target: Activity onPause com.example.root.activitylifecycle I/target: SecondActivity onCreate com.example.root.activitylifecycle I/target: SecondActivity onStart com.example.root.activitylifecycle I/target: SecondActivity onResume com.example.root.activitylifecycle I/target: Activity onStop
注意:当第二个activity执行到onResume
方法后第一个activity才执行onStop
方法,即当第二个activity就绪以后第一个activity才执行onStop方法,但第一个activity并无执行onDestroy方法,它被放入后退栈中。接下来按下退格键返回第一个activity
spa
com.example.root.activitylifecycle I/target: SecondActivity onPause com.example.root.activitylifecycle I/target: Activity onRestart com.example.root.activitylifecycle I/target: Activity onStart com.example.root.activitylifecycle I/target: Activity onResume com.example.root.activitylifecycle I/target: SecondActivity onStop com.example.root.activitylifecycle I/target: SecondActivity onDestroy
第二个activity的生命周期执行完成,第一个activity执行onRestart
到onResume
从新就绪,再次按下退格键日志
com.example.root.activitylifecycle I/target: Activity onPause com.example.root.activitylifecycle I/target: SecondActivity onStop com.example.root.activitylifecycle I/target: SecondActivity onDestroy
第一个activity生命周期执行结束code
当屏幕旋转的时候activity就会从新执行onCreate,咱们能够用屏幕旋转模拟activity异常销毁生命周期
protected void onSaveInstanceState(Bundle outState) { Log.i("target","Activity onSaveInstanceState"); outState.putString("target","this is onSaveInstanceState saved bundle data"); } protected void onRestoreInstanceState(Bundle savedInstanceState) { Log.i("target","Activity onRestoreInstanceState"); Log.i("target",savedInstanceState.getString("target")); }
日志信息
com.example.root.activitylifecycle I/target: Activity onSaveInstanceState com.example.root.activitylifecycle I/target: Activity onRestoreInstanceState com.example.root.activitylifecycle I/target: this is onSaveInstanceState saved bundle data
standard模式
:这是默认模式,每次激活Activity时都会建立Activity实例,并放入任务栈中,使用场景(大多数Activity)
singleTop模式
:若是任务栈的栈顶正好存在该Activity的实例,就重用该实例(会调用实例的onNewIntent()),不然就会建立新的实例并放入栈顶,计时栈中已经存在该Activity的实例,只要不在栈顶,都会建立新的实例,使用场景(新闻类或者阅读类App的内容页面)
singleTask模式
:若是栈中已经有该Activity的实例,就重写该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,所以在他上面的实例将会被移出栈,若是栈中不存在该实例,将建立新的实例放入栈中,使用场景如浏览器的主界面,无论从多少个应用启动浏览器,只会启动主界面一次,其他都会走onNewIntent,并清空主界面上的其余页面
singleInstance模式
:在一个新栈中建立该Activity的实例,并让多个应用共享该栈中的该activity实例,一旦该模式的activity实例已经存在于某个栈中,任何英语再激活该activity时都会重用该栈中的实例,会调用(onNewIntent()),其效果至关于多个应用共享一个应用,无论谁激活该activity都会进入同一个应用中,使用场景(闹铃提示,将闹钟提醒与闹钟设置分离),singleinstance不要敢于中间页面,若是用于中间页面,跳转会有问题(A->B->(singleinstance)->C)彻底退出后再次启动首先打开的是B
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
;//指定Activity为"singleTask"启动模式intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
;//指定Activity为"singleTop"启动模式intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
;//位于其上的Activity都要出栈,相似"singleTask"intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
;//不会出如今Activity的历史列表中,等同于android:excludeFromRecents="true"
为了匹配过滤列表,须要同时匹配过滤列表中的action,category,data信息。一个Activity能够有多个intentFilter,一个Intent只要能匹配任何一组intentFilter便可成功启动对应Activity
action区分大小写,必须存在,只需匹配一个
category的匹配规则能够没有,如果有,必须所有匹配(能够比过滤规则中少)
示例:
<intent-filter> <action android:name="com.example.root.saveinstancelearn.secondactivity"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="com.example.root.saveinstancelearn.secondactivity"/> </intent-filter>
Intent intent=new Intent("com.example.root.saveinstancelearn.secondactivity"); intent.addCategory(Intent.CATEGORY_DEFAULT); startActivity(intent);
data与action相似(data语法以下)
<data android:scheme="string" android:host="string" android:port="string" android:path="string" android:pathPattern="string" android:pathPrefix="string" android:mimeType="string" />
data有两部分组成,mimeType和URI。mimeType指定媒体类型,好比image/jpeg等
匹配示例:
<intent-filter> <data android:mimeType="image/*"/> <intent-filter>
intent.setDataAndType(Uri.parse("file://abc"),"image/png")
;
ps:若是要为Intent指定完整的data,必须调用setDataAndType方法,不能先调用setData在调用setType,觉得这两个方法会清除对方的值;
实例
<intent-filter> <data android:mimeType="video/mpeg" android:scheme="http"/> <data android:mimeType="audio/mpeg" android:scheme="http"/> </intent-filter>
intent.setDataAndType(Uri.parse("http://abc"),"video/mpeg")
;或者intent.setDataAndType(Uri.parse("http://abc"),"audio/mpeg")
;
Email:sxh13208803520@gmail.com