「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战」
相关文章:
Android 开发之Activity的启动模式-Standard
Android 开发之Activity的启动模式-SingleTop
Android 开发之Activity的启动模式-SingleTask
Android 开发之Activity的启动模式-SingleInstance
Android中Activity的四种启动模式已经介绍了2种了,这篇文章介绍第三章,也是除了默认的模式之外,使用的最多的一种启动模式:- 栈内复用模式(SingleTask
)
说到这大家应该能感觉到为什么是用的比较多的了,因为是栈内复用,activity的管理模式就是栈管理,那么栈复用模式,也是对资源的一种复用,当然,也是需要根据实际的应用场景来正确使用,每种模式的使用场景都是经过大佬们的总结的来的,根据业务场景来选择不同的模式管理activity的栈,才是启动模式的初衷。那么下面就来介绍singleTask
SingleTask的定义
定义的解释 如下:
- 设置了
singleTask
启动模式的Activity,再次被其他的Intent的唤起,则不会创建新的Activity,而且直接唤起之前已经创建的Activity,它在启动的时候,系统会先查找有没有taskAffinity
属性值相同的task存在。如果存在这样的task,就会在这个task中启动;否则就会在新task中启动。因此如果我们想要设置了singleTask
启动模式的act在新的task中启动,就要为它设置一个独特的taskAffinity
属性值,因为默认一个app的所有act都有同一个taskAffinity
值,那就是应用包名。 - 如果设置了
singleTask
启动模式的act是在已有task中启动的,系统会在此task中查看是否存在这个act的实例,如果没有的话,会简单创建并加进去,否则并不会创建此act的新实例,而是已有实例的onNewIntent(Intent)
方法会被调用(紧接着的是onResume方法),并且在此act之上的所有别的act都会出栈,走完整的销毁流程,即他们的onDestroy()
之类的方法会被调用,从而确保这个singleTask
act的实例此时位于task的栈顶。 SingleTask简单的说就是,如果已经启动了的Activity,再次被其他的Intent的唤起,则不会创建新的Activity,而且直接唤起之前已经创建的Activity,并且在这个Activity栈上的activity都会被销毁,让当前的Activity处于栈顶,被唤起的Activity不会重新走完整的生命周期,而是直接走Activity的onResume,对于有数据传输的,需要再onNewIntent方法中接受相关参数。 那么用代码简单演示一下:
配置清单文件launchMode
<activity
android:name=".MainActivity"
android:launchMode="singleTask"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
设计到生命周期的,添加生命周期的方法调用:
@Override
protected void onResume() {
super.onRestart();
Log.d("MainActivity", "onResume");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//打印当前对象
Log.d("MainActivity", this.toString());
//去掉title
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
//获取secondBtn
Button secondBtn = (Button) findViewById(R.id.singleTopBtn);
//添加点击事件
secondBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
//为了测试singleTop启动模式,当点击按钮时,启动SecondActivity活动
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
//启动活动
startActivity(intent);
}
});
}
其实这里也可以用onNewIntent
给SecondActivity也添加打印日志的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//打印当前对象
Log.d("SecondActivity", this.toString());
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_second);
//获取按钮
Button myButton = (Button)findViewById(R.id.myButton1);
//点击事件
myButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//启动MainActivity活动
Intent intent = new Intent(SecondActivity.this,MainActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("SecondActivity", "onDestroy");
}
运行demo,点击MainActivity跳转到SecondActivity,再点击按钮 日志打印如下: MainActivity onResume SecondActivity onResume onDestroy
可以看到MainActivity没有走onCreate,直接onResume,而SecondActivity走了onDestroy
SingleTask 是在开发过程中使用到的比较多的启动模式,但是如果使用不慎也会造成一些困扰,所以大家在使用前一定要对其有一定的了解,对它的使用场景,已经使用后带来的效果有一定的认知,否则也会造成不必要的bug,并且不太容易发现和解决。个人见解,如有不对,还请指出,欢迎留言评论。