在上篇文章中已经介绍了和启动模式相关的基础知识,想了解的小伙伴能够戳下方连接:blog.csdn.net/qq_42171948…android
在对activity四种启动模式有所理解以后。这篇文章将会继续解决上篇所留下的问题浏览器
1.如何设置不一样的任务栈?bash
2.当activityA以标准模式启动B的时候,B的实例被建立且处于activityA任务栈的顶端,那么这个时候B启动了A(standard)呢?app
3.这两种设置方式有什么区别呢?经常使用的标志位有好几个,组合起来使用又有什么不一样的效果呢?ide
咱们知道,默认状况下,全部activity都运行在同一个任务栈中,此栈名为 元素设置的软件包名称。那么如何设置不一样的任务栈,很简单,用taskAffinity。学习
taskAffinity是一个代表activity想在哪一个任务栈的参数。在manifest里面能够进行设置。ui
<activity android:name=".MainActivity"
android:taskAffinity="com.example.administrator.test">
复制代码
<activity android:name=".MainActivity"
android:taskAffinity="com.example.administrator.test">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity2"
android:launchMode="singleTask"
android:taskAffinity="com.example.administrator.test1">
</activity>
复制代码
mainactivity:this
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView show = (TextView) findViewById(R.id.tv_show);
show.setText(this.toString() + "\ntaskId:" + this.getTaskId());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.e("task", "intent1=" + intent);
}
public void jump(View v) {
Intent intent = new Intent(this,MainActivity2.class);
startActivity(intent);
}
}
复制代码
mainactivity2:spa
public class MainActivity2 extends AppCompatActivity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
TextView show = (TextView) findViewById(R.id.tv_show);
show.setText(this.toString() + "\ntaskId:" + this.getTaskId());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.e("task","intent2"+intent);
}
}
复制代码
现象是: .net
当两个activity的taskAffinity同样时:
由此能够得出结论: 以1启动2来讲
(1) 当1和2的taskAffinity相同时:当第一次建立2 的实例时,并不会建立新的task,乃是将在1的task中建立2的实例;当1的task已经存在2的实例时,此时启动2,则会检查一下task中是否有2实例,而后将2上的其余实例出栈,将2实例置于栈顶,从而实现了跳转。
(2) 当1和2的taskAffinity不一样时:当第一次建立2 的实例时,将会建立新的task,在指定的task中建立2的实例;当指定task已经存在2的实例时,此时启动2,则会检查一下task中是否有2实例,而后将2上的其余实例出栈,将2实例置于栈顶,从而实现了跳转。
说了这么多,其实就是很简单的一句话,taskAffinity设置新启动的activity应处于哪一个task,一种是在建立它的activity所处栈,一种是新栈,其余的分析就是对singleTask的理解而已。
另外,文档给咱们提供了一种会出现:原本在某一个Task中,以后出现了转移的状况。 若是该Activity的allowTaskReparenting属性设置为true,当启动它的任务栈进入后台,一个和它有相同affinity的Task进入前台时,该Activity会进入到该前台的task中。
(如下是翻译) 例子是,若是电子邮件包含网页连接,则点击连接会调出可显示网页的 Activity。 该 Activity 由浏览器应用定义,但做为电子邮件任务的一部分启动。 若是将其父项更改成浏览器任务,它会在浏览器下一次转至前台时显示,当电子邮件任务再次转至前台时则会消失。
个人理解:当一个应用A启动了应用B的某个ActivityC后(C的taskAffinity 为B),若是咱们将ActivityC的allowTaskReparenting属性设置为true,当应用B被启动后,系统会发现Activity C所需的任务栈已经存在,ActivityC就会从A的任务栈转移到B的任务栈中。
(如下仍是翻译) Activity 的亲和关系由 taskAffinity 属性定义。 任务的亲和关系经过读取其根 Activity 的亲和关系来肯定。所以,按照定义,根 Activity 始终位于具备相同亲和关系的任务之中。 因为具备“singleTask”或“singleInstance”启动模式的 Activity 只能位于任务的根,所以更改父项仅限于“standard”和“singleTop”模式。
个人理解: 每一个task有affinity属性,等于它的根 Activity的taskAffinity的值。singletask和singleinstance模式下,Atask中只能有一个A实例,且为根,那么就不能从新宿主,要否则的话这个栈就崩了呢~而另外两种的话,由于不是根因此能够在特定情境下自由游荡。(若理解得不对,望小伙伴指正)
因为篇幅和时间关系,文章就到此结束,剩下的问题待Android初级开发笔记-- Activity启动模式的学习(3)再进行讨论~
- 咱们正在招募小伙伴,有兴趣的小伙伴能够把简历发到 app@talkmoney.cn,备注:来自简书社区
- 详情能够戳这里--> 广州芦苇信息科技