在Android中:
1、每個任務(wù)棧都有一個親族值,此親族值與棧底的activity親族值相同。
2、每個Activity都有一個親族值,默認(rèn)與application元素親族值相同。
3、每個應(yīng)用的application也有一個親族值,假如沒有配置默認(rèn)與清單
根元素的包名相同。
假如需要配置activity或application的親族值需要借助taskAffinity屬性進(jìn)行配置,它的值是一個包結(jié)構(gòu)形式的字符串。
Android中親族值通常會與啟動模式結(jié)合使用,共同決定activity在任務(wù)棧中的一個存儲。(例如存儲在哪個任務(wù)棧)
singletask&taskAffinity
1、當(dāng)啟動一個singletask模式的activity時,首先檢測內(nèi)存中有沒有與此activity親族值相同的任務(wù)棧,有則存儲,沒有則創(chuàng)建新的任務(wù)棧進(jìn)程存儲。
2、當(dāng)通過singletask模式的activity啟動其它standard 和singletop模式的activity時,這些activity會與此singletask模式的activity存在同一個任務(wù)棧(無論是否具備相同親族值)。
singleInstance&taskAffinity
當(dāng)通過singleInstance的activity啟動其它acitvity時,首先檢測內(nèi)存中有沒有與此activity親族值相同的任務(wù)棧,有則直接存儲,沒有則創(chuàng)建新的任務(wù)棧進(jìn)行存儲。
Activity的親族設(shè)置與啟動模式會影響activity在任務(wù)棧中的一個存儲位置,
親族設(shè)置的配置需要借助activity的taskAffinity屬性進(jìn)行配置。
Activity在啟動時是可以指定啟動模式的,
一般可以在清單配置文件中通過修改activity的launchMode屬性進(jìn)行配置,
它的值有如下
四種類型:
1、standard(標(biāo)準(zhǔn)模式):每次啟動activity都會重新創(chuàng)建一個新的實例。(此模式為默認(rèn)模式)
2、singleTop(棧頂模式):當(dāng)此activity已經(jīng)是棧頂時,再次啟動不會創(chuàng)建新的activity.
3、singleTask(單任務(wù)模式):一個任務(wù)棧中此activity的實例只能有一份,
當(dāng)它不是棧頂時,再次啟動它時,位于它上面的activity會銷毀。
4、singleInstance(單實例模式):在內(nèi)存中此activity實例只有一份,且會獨享一個任務(wù)棧。
<activity
android:name="com.example.day17.FirstActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.example.day17.SecondActivity"
android:label="SecondActivity"
android:launchMode="singleInstance">
</activity>
<activity
android:name="com.example.day17.ThirdActivity"
android:label="ThirdActivity"
android:taskAffinity="a.b.c.d">
</activity>
創(chuàng)建四個任務(wù),其他三個繼承BaseActivity
package com.example.day17;
public class FirstActivity extends BaseActivity {
}
BaseActivity 繼承Activity
public class BaseActivity extends Activity {
private String TAG;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView nameTv=(TextView) findViewById(R.id.textView1);
TextView hashTv=(TextView) findViewById(R.id.textView2);
TextView taskTv=(TextView) findViewById(R.id.textView3);
TAG=getClass().getSimpleName();
nameTv.setText(TAG);
hashTv.setText("hashcode:"+hashCode());
taskTv.setText("taskId:"+getTaskId());
Log.i(TAG, "onCreate");
}
public void onClick(View v){
if(v.getId()==R.id.button1){
startActivity(new Intent(this,FirstActivity.class));
}else if(v.getId()==R.id.button2){
startActivity(new Intent(this,SecondActivity.class));
}else if(v.getId()==R.id.button3){
startActivity(new Intent(this,ThirdActivity.class));
}
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.i(TAG, "onStart");
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
Log.i(TAG, "onRestart");
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.i(TAG, "onResume");
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.i(TAG, "onPause");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.i(TAG, "onStop");
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i(TAG, "onDestroy");
}
}
效果運行圖:
點擊FirstActivity:
點擊SecondActivity:
點擊ThirdActivity: