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>