Activity(model&affinity)

在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");
    }

}

效果運行圖:

Paste_Image.png

點擊FirstActivity:

Paste_Image.png

點擊SecondActivity:

Paste_Image.png

點擊ThirdActivity:

Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容