Android 啓動模式

1Task與BackStack的概念

在Android中通過任務(Task)來管理活動,Task就是一些列活動的集合。每個應用程序運行都會對應創建一個Task,android通過BackStack來管理Task。
Task的活動按啓動的先後順序,依次保存到BackStack中,每個Task都有自己對應的id號(非R文件中),可以通過getTaskId()方法獲得。
每當新建一個活動時,該活動就會在BackStack中入棧,並且處於棧頂位置。當按下back建或者finish活動時,這個活動就會出棧,這時下一個活動就會處於棧頂位置。

2在AndroidManifes文件中配置Activity的啓動模式

Activity的啓動模式對我們來說是一個新的概念,在實際開發過程中會給一些Activity設定恰當的啓動模式來實現特定的需求。
啓動模式一共分爲四種,分別爲:standard、singleTop、singleTask和singleInstance,可在AndroidManifest.xml中通過給標籤指定android:launchMode屬性來選擇啓動模式。

<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="standard">

3 standard啓動模式
Standard叫做標準啓動模式,是活動啓動的默認模式,即使不在指定該模式的情況下,活動都還是會以該模式啓動。在standard模式下的活動,不管活動是否存在每次啓動都會新建這個活動。

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("Tag", "MainActivityonCreate"+getTaskId());
        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, MainActivity.class));
            }
        });
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
          Log.d("Tag", "MainActivityonDestroy");
    }
}

4singleTop啓動模式
SingleTop:共享棧頂模式,
在啓動這一類活動時,系統會先檢測當前 Task,看該 Task 的棧頂是不是
該活動的實例,如果是的話,就不需要再創建該活動實例
但是這個啓動模式只針對棧頂元素。

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("Tag", "onCreate"+getTaskId());
        setContentView(R.layout.activity_main);
        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this,MainActivity.class));
            }
        });
    }
}

AndroidManifest.xml

<activity
            android:name="com.example.android_818_singletop.MainActivity"
            android:label="@string/app_name" 
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

5 singleTask啓動模式
SingleTask 又叫共享棧,每次啓動該活動時系統會首先在BackStack中檢查是否存在該活動的實例,如果發現已經存在則直接使用該實例,並把這個活動之上的所有活動統統出棧,如果沒有發現就會創建一個新的活動實例。SingleTask適合作爲程序入口點。例如程序主界面

<activity
            android:name="com.example.android_818_singletask.MainActivity"
            android:label="@string/app_name"
            android:launchMode="singleTask" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("Tag", "MainActivity_onCreate"+getTaskId());
        findViewById(R.id.btn1).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, SecondActivity.class));
            }
        });
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("Tag", "MainActivity_onDestroy"+getTaskId());
    }
}

secondActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("Tag", "MainActivity_onCreate"+getTaskId());
        findViewById(R.id.btn1).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, SecondActivity.class));
            }
        });
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("Tag", "MainActivity_onDestroy"+getTaskId());
    }
}

ThirdActivity.java

public class ThirdActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_three);
        Log.d("Tag", "ThirdActivity_onCreate"+getTaskId());
        findViewById(R.id.btn3).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(ThirdActivity.this, MainActivity.class));
            }
        });
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("Tag", "ThirdActivity_onDestroy"+getTaskId());
    }
}

6.singleInstance啓動模式(共享引用)
SingleInstance模式是這四種模式中最爲特殊的,指定爲singleInstance模式的活動啓動時,會用一個新的BackStack來管理該活動。

<activity android:name="com.example.android_818_singletask.SecondActivity"
           android:launchMode="singleInstance"></activity>
<activity android:name="com.example.android_818_singletask.ThirdActivity">
</activity>
 <activity
android:name="com.example.android_818_singletask.FourActivity"
           android:launchMode="singleInstance">
</activity>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章