安卓Activity 跳转的标记深度思考FLAG_ACTIVITY_NEW_TASK,singleTask

安卓Activity 跳转的标记深度思考FLAG_ACTIVITY_NEW_TASK,singleTask

知识储备参考地址:http://blog.ZEEKLOG.net/ljz2009y/article/details/26621815 FLAG_ACTIVITY_NEW_TASK标记了FLAG_ACTIVITY_NEW_TASK,就一定会创建一个新的TASK吗,实验证明这是一个必要条件,还要结合taskAffinity来看,
A .如果和H5Activity 具有相应的亲戚存在了,那么只是会把H5Activity 加入的亲缘的TASK中
B. 如果和H5Activity 没有对应的亲缘关系的TASK,那么就会创建一个新的TASK了

public static void startActivity(Context context, Bundle extras) {    Intent intent = new Intent(context, H5Activity.class);    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    if (extras != null)        intent.putExtras(extras);    context.startActivity(intent);}

应用场景举例
会想一下,我们打开升级面板(和当前应用的TASK亲缘关系肯定不同)的时候是不是增加了一个FLAG_ACTIVITY_NEW_TASK,从而避免升级界面加入当前应用的TASK,
从而避免升级过程中应用推出导致升级面板也退出的情况




singleTask 这个属性其实被会系统当作FLAG_ACTIVITY_NEW_TASK 理解,这里我们把亲缘关系设置为其他APP的包名(一个APP的默认亲缘关系就是包名), 那么另外一个APP的在进程中是维持在首页的(other app HomeActivity),和SencondActivity 属于相同的TASK,返回或者 finish掉都是回到 上一个界面(HomeActivity,当然前提是另外一个HomeActivity得在任务栈中)    <activity        android:name=".SenondActivity"        android:launchMode="singleTask"        android:taskAffinity="com.otherapp.package"        > </activity>


public class SenondActivity extends AppCompatActivity { @Override     protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_senond); findViewById(R.id.testTv2).setOnClickListener(new View.OnClickListener() { @Override             public void onClick(View view) { finish(); } }); } }关于空taskAffinity的测试结论:
taskAffinity如果为空,那么空taskAffinity之间的TASK没有亲缘关系,展示如下

www.zeeklog.com - 安卓Activity 跳转的标记深度思考FLAG_ACTIVITY_NEW_TASK,singleTask



不为空有亲缘关系的展示如下


www.zeeklog.com - 安卓Activity 跳转的标记深度思考FLAG_ACTIVITY_NEW_TASK,singleTask