Android 开发之Activity的启动模式-SingleTask

3,943 阅读4分钟

「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战

相关文章:
Android 开发之Activity的启动模式-Standard
Android 开发之Activity的启动模式-SingleTop
Android 开发之Activity的启动模式-SingleTask
Android 开发之Activity的启动模式-SingleInstance

Android中Activity的四种启动模式已经介绍了2种了,这篇文章介绍第三章,也是除了默认的模式之外,使用的最多的一种启动模式:- 栈内复用模式(SingleTask
说到这大家应该能感觉到为什么是用的比较多的了,因为是栈内复用,activity的管理模式就是栈管理,那么栈复用模式,也是对资源的一种复用,当然,也是需要根据实际的应用场景来正确使用,每种模式的使用场景都是经过大佬们的总结的来的,根据业务场景来选择不同的模式管理activity的栈,才是启动模式的初衷。那么下面就来介绍singleTask

SingleTask的定义

定义的解释 如下:

  1. 设置了singleTask启动模式的Activity,再次被其他的Intent的唤起,则不会创建新的Activity,而且直接唤起之前已经创建的Activity,它在启动的时候,系统会先查找有没有taskAffinity属性值相同的task存在。如果存在这样的task,就会在这个task中启动;否则就会在新task中启动。因此如果我们想要设置了singleTask启动模式的act在新的task中启动,就要为它设置一个独特的taskAffinity属性值,因为默认一个app的所有act都有同一个taskAffinity值,那就是应用包名。
  2. 如果设置了singleTask启动模式的act是在已有task中启动的,系统会在此task中查看是否存在这个act的实例,如果没有的话,会简单创建并加进去,否则并不会创建此act的新实例,而是已有实例的onNewIntent(Intent)方法会被调用(紧接着的是onResume方法),并且在此act之上的所有别的act都会出栈,走完整的销毁流程,即他们的onDestroy()之类的方法会被调用,从而确保这个singleTaskact的实例此时位于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,并且不太容易发现和解决。个人见解,如有不对,还请指出,欢迎留言评论。