06 intent flag三种属性
flag属性可以看做和写在清单文件中的启动模式一样 但效果有一定差别
1,FLAG_ACTIVITY_SINGLE_TOP:启动模式里的SingleTop一致 如果X启动模式设置为FLAG_ACTIVITY_SINGLE_TOP如果不在栈顶则创建一个X实例 如果在不创建。
2,FLAG_ACTIVITY__CLEAR_TOP:类似singleTask 不同之处:不管在不在此在栈顶都会删除自身然后重新创建一个新的Activity 所以叫CLEAR_TASK 具体: 首先将上方的Activity pop出 将自身的Activity销毁 重新创建一个Activity 在栈顶
>如果当前Activity存在 在栈顶 将将自身的Activity销毁 重新创建一个Activity
3,FLAG_ACTIVITY_NEW_TASK
>1,不在清单文件中设置 和默认启动模式是一致的
>2,在清单文件中设置属性
android:taskAffinity="aa.bb"
android:allowTaskReparenting="true"
taskAffinity用于指定当前Activity(activity1)所关联的Task,
allowTaskReparenting用于配置是否允许该activity可以更换从属task
例子:第一个界面代码:
package com.qf.day06_intentflag; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; public class MainActivity extends Activity { private static final String TAG ="MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.e(TAG, "===id==>"+this.getTaskId()+"==onCreate=="+this.hashCode()); } @Override protected void onNewIntent(Intent intent) { // TODO Auto-generated method stub super.onNewIntent(intent); Log.e(TAG, "===id==>"+this.getTaskId()+"==onNewIntent=="+this.hashCode()); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.e(TAG, "===id==>"+this.getTaskId()+"==onDestroy=="+this.hashCode()); } public void Onclick(View v){ switch (v.getId()) { case R.id.btn01: Intent intent = new Intent(MainActivity.this, SecondActivity.class); //设置标记(启动模式) intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); break; case R.id.btn02: Intent intent1 = new Intent(MainActivity.this, ThreeActivity.class); intent1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent1); break; case R.id.btn03: Intent intent2 = new Intent(MainActivity.this, FourActivity.class); intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent2); break; default: break; } } }
第一个对应界面:
第四个个界面代码:
package com.qf.day06_intentflag; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; public class FourActivity extends Activity{ private static final String TAG ="FourActivity"; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.layout3); Log.e(TAG, "===id==>"+this.getTaskId()+"==onCreate=="+this.hashCode()); } @Override protected void onNewIntent(Intent intent) { // TODO Auto-generated method stub super.onNewIntent(intent); Log.e(TAG, "===id==>"+this.getTaskId()+"==onNewIntent=="+this.hashCode()); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.e(TAG, "===id==>"+this.getTaskId()+"==onDestroy=="+this.hashCode()); } public void onMyClick(View v){ switch (v.getId()) { case R.id.btnMain: Intent intent1 = new Intent(FourActivity.this, MainActivity.class); startActivity(intent1); break; case R.id.btnFour: Intent intent2 = new Intent(FourActivity.this, FourActivity.class); startActivity(intent2); break; default: break; } } }
第四个对应界面:
清单文件::
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.qf.day06_intentflag" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.qf.day06_intentflag.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SecondActivity"></activity> <activity android:name=".ThreeActivity"></activity> <activity android:label="第四个" android:name=".FourActivity" android:taskAffinity="aa.bb" android:allowTaskReparenting="true" ></activity> </application> </manifest></span>
我们进入第一个界面的时候
我们点击 FLAG_ACTIVITY_NEW_TASK
发现重新创建了一个栈: 这是我们再点机跳转到MainActivity
发现新生成的MainActivity在新的栈区中
我们打开后台窗口看看:
发现有两个进程,可以用此方法方便用户选择一个后台界面同时处理两件事。
我们继续在第四个Activity 的界面上
我们点击继续点击FLAG_ACTIVITY_NEW_TASK 看看
可见在一个FourActivity ---》》FLAG_ACTIVITY_NEW_TASK生成的心亲和栈区中 无法再生成一个FourActivity ---》》FLAG_ACTIVITY_NEW_TASK心的亲和栈区(这里只影响FourActivity 在生产亲和栈区 但不影响 其他 Activity生成亲和栈区 比如说在这里再生一个界面的的亲和栈区 )
注意FLAG_ACTIVITY_NEW_TASK 必须配合 android:taskAffinity
android:allowTaskReparenting="true"使用。
****************************************************************************
在这里我们假设 MainActivity设置以下属性()
即与FourActivity ---》》FLAG_ACTIVITY_NEW_TASK生成的亲和区是一样的话
那么生成的亲和区还是在MainActivity的 栈中后台只有一个程序
>>>>>>>>>>>> 在这里我们假设一种情况<<<<<<<<<<<<<<<<<<<<<<<<<
A(一个Activiry)在清单中设置了亲和栈=“AA.AA” B(一个Activiry)在清单中设置了亲和栈为=“BB.BB”
A此时跳转到B 但intent flag不设置任务启动模式 那么他们依然在一个栈
如果C(一个Activiry)设为亲和栈为=“AA.AA”
因为B会依然跟随A所以 ABC三个在一个栈区中
如果我们设置C=“BB.BB”
那么AB依然在一起 只不过C在另一个栈区中后台可以看见两个
****************************************************************************
我们在82栈区按下返回键
我们点击 “跳转到FourActivity” 自己跳转 但没有设置intent的flag属性 发现可以无限生成 可见他不影响 。
************在82栈区界面再点击mainActivity******************
*********在后台选择界面返回81栈区界面*************
然后再81栈区点击FLAG_ACTIVITY_NEW_TASK
此居然返回到了82栈区当前界面(注意返回到的不是FourActivity界面 而是FourActivity生成亲和栈区栈顶的界面)