生活程序员

学习笔记| (二) 组件篇之Activity启动模式

2018-09-22  本文已影响34人  yanerly

一.启动模式:

1.Standard
android:launchMode="standard"
MainActivity-->com.code.MainActivity@2cdaf713-->栈:885
MainActivity-->com.code.MainActivity@2d2219ca-->栈:885
MainActivity-->com.code.MainActivity@177c5ca6-->栈:885
2.SingleTop
android:launchMode="singleTop"
A:MainActivity-->com.code.MainActivity@2cdaf713-->栈:887
B:onCreate-->com.code.BActivity@2d2219ca-->栈:887
B:onNewIntent-->com.code.BActivity@2d2219ca-->栈:887
B:onNewIntent-->com.code.BActivity@2d2219ca-->栈:887
3.SingleTask
android:launchMode="singleTask"
A:MainActivity-->com.code.MainActivity@2cdaf713-->栈:889
B:onCreate-->com.code.BActivity@2d2219ca-->栈:889
C:onCreate-->com.code.CActivity@1490bfe8-->栈:889
B:onNewIntent-->com.code.BActivity@2d2219ca-->栈:889
4.SingleInstance
android:launchMode="singleInstance"
A:MainActivity-->com.code.MainActivity@2cdaf713-->栈:892
B:onCreate-->com.code.BActivity@2d2219ca-->栈:893
B:onNewIntent-->com.code.BActivity@2d2219ca-->栈:893

注意

getApplication().startActivity(new Intent(this,BActivity.class));

如果这样启动一个Activity,会报错:

Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

之前在项目中,来电时会出一个Activity,就报了这个错,这个错是什么原因导致的呢?
因为getApplication()是非Activity类型的context,并不存在任务栈一说,所以启动B的时候,B会添加到getApplication()所在的任务栈,这就矛盾了,这时候并不存在任务栈,所以只能将B添加到一个新的任务栈中

任务栈

<activity
            android:name=".BActivity"
            android:launchMode="singleTask"
            android:taskAffinity="com.app.b"/>

也就是所有taskAffinity相同的会在一个任务栈中存在;

通过Intent标志位指定启动模式

 intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

②这个和在xml中的效果是一样的,singleTask

 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

③这个表示将上面的activity都清空出栈,一般和②搭配使用,如果要启动的activity存在,则调用onNewIntent(),清空它上面的activity;如果要启动的activity是standard模式,则它会连同它上面的activity一块清空,然后创建新的实例

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

④这个表示将要启动的activity不会添加到历史activity中,和在xml中加入android:excludeFromRecents="true"效果一样

intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);

Intent-filter匹配规则

intent-filter匹配规则.png
上一篇 下一篇

猜你喜欢

热点阅读