Android_Activity_启动模式
Activity的启动模式也是在面试中经常会问到的,希望本人的这篇Blog对大家能够在面试中有所帮助。
在实际的项目中我们应该根据特定的需求为每个Activity指定恰当的启动模式。Activity的启动模式一共有四种:standard、singleTop、singleTask、singleInstance,可以在AndroidManifest.xml中通过action标签指定android:launchMode属性来选择启动模式。
Standard
Standard是Activity的默认的启动模式,在不进行显示指定的情况下,所有的活动会自动使用这种启动模式。使用Standard模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。如果还是不太理解那就看看下面的代码吧:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("FirstActivity",this.toString());
//一定要记住下面这行代码;所写的位置。
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_first);
Button btn = (Button) findViewById(R.id.firstActivity_btnOne);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent(FirstActivity.this,FirstActivity.class);
startActivity(intent);
}
});
}
下面我把log日志贴出来你就什么都明白了;
06-05 15:17:57.204 30208-30208/com.example.chw.activitytest I/FirstActivity: com.example.chw.activitytest.FirstActivity@422d1378
06-05 15:18:04.644 30208-30208/com.example.chw.activitytest I/FirstActivity: com.example.chw.activitytest.FirstActivity@422f5a30
06-05 15:18:07.834 30208-30208/com.example.chw.activitytest I/FirstActivity: com.example.chw.activitytest.FirstActivity@422fdae8
可以看见当我们每一次点击按钮的时候都会创建一个FirstActivity的实例
如果还是不太理解,本人献上一幅图:
SingleTop
当活动的启动模式指定为singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动了,则认为可以直接使用它,不会再创建新的活动实例。
我们通过修改AndroidManifest.xml文件来改变启动模式。
我们再来看Log日志:
06-05 15:29:08.244 9045-9045/com.example.chw.activitytest I/FirstActivity: com.example.chw.activitytest.FirstActivity@422d12a8
无论怎么点击按钮,log日志只打印了这一行,如果不行,你可以按Back键,如果按一次Back键就能退出程序,那么就说明当前的启动模式是singleTop。注意:如果FirstActivity并未处于栈顶位置时,这时在启动FirstActivity,还是会创建新的实例。如果还是不太理解,那么在奉上一张图:
SingleTask
有什么启动模式可以让某个活动在整个应用程序的上下文中只存在一个实例呢?答案当时有了,那就是singleTask。当活动的启动模式指定为SingleTask,每次启动该活动时系统会首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。 还是来看一下代码吧:
1、AndroidManifest.xml中的代码:
<activity android:name=".FirstActivity"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
2、FirstActivity中的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("Activity",this.toString());
//一定要记住下面这行代码;所写的位置。
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_first);
Button btn = (Button) findViewById(R.id.firstActivity_btnOne);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("Activity","FirstActivity onRestart()");
}
3、SecondActivity中的代码;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_second);
Log.d("Activity","SecondActivity onCreate()"+this.toString());
Button btn2 = (Button) findViewById(R.id.second_Btn2);
btn2.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent =new Intent(SecondActivity.this,FirstActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("Activity","SecondActivity onDestory()");
}
4、我们可以一起来看一下打印的log 日志;
06-05 15:49:02.094 27429-27429/com.example.chw.activitytest D/Activity: com.example.chw.activitytest.FirstActivity@422cf5a0
06-05 15:49:43.164 27429-27429/com.example.chw.activitytest D/Activity: SecondActivity onCreate()com.example.chw.activitytest.SecondActivity@422f65d8
06-05 15:50:14.444 27429-27429/com.example.chw.activitytest D/Activity: FirstActivity onRestart()
06-05 15:50:14.864 27429-27429/com.example.chw.activitytest D/Activity: SecondActivity onDestory()
如果还是不太理解,本人还是奉上一幅图:
SingleInstance
启动singleInstance模式的活动会启动一个新的返回栈来管理这个活动。
1、在AndroidManifest.xml中修改SecondActivity,如下:
<activity android:name=".SecondActivity"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.activitytest.MY_CATEGORY" />
</intent-filter>
</activity>
2、在FirstActivity中按钮的点击事件修改为以下的代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("Activity","FirstActivity id"+getTaskId());
//一定要记住下面这行代码;所写的位置。
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_first);
Button btn = (Button) findViewById(R.id.firstActivity_btnOne);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
3、在SecondActivity中的按钮的点击事件,修改为下面的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_second);
Log.d("Activity","SecondActivity id"+getTaskId());
Button btn2 = (Button) findViewById(R.id.second_Btn2);
btn2.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent =new Intent(SecondActivity.this,ThirdActivity.class);
startActivity(intent);
}
});
}
4、在ThirdActivity中的代码修改为以下的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
Log.d("Activity","ThirdActivity id"+getTaskId());
setContentView(R.layout.activity_third);
}
5、看一下打印的log日志:
06-05 16:00:39.054 6671-6671/com.example.chw.activitytest D/Activity: FirstActivity id42
06-05 16:00:54.094 6671-6671/com.example.chw.activitytest D/Activity: SecondActivity id43
06-05 16:01:06.034 6671-6671/com.example.chw.activitytest D/Activity: ThirdActivity id42
可以清楚的看到SecondActivity的返回栈和别的Activity不一样。
如果还是不怎么明白,那就看一下这幅图吧:
本人只是在这里将Activity的四种启动模式的理论知识介绍给大家了,学习理论知识就是为了实践,那么Activity的四种启动模式什么时候该用什么样的启动模式,在这里我就不介绍了,如果你有兴趣可以点击下面链接