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>