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>