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

4,347 阅读4分钟

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

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

前面已经介绍了3中Activity的启动模式了,standard,singleTop,singleTask,不知道大家有没有了解的清楚,如有什么说的不对的地方还请指正,今天介绍四种启动模式中的最后一种singleInstance,看字面意思,大家肯定会想到是不是跟单例有关系,其实意思有一丢丢的相似,它是独立的栈管理,比如A->B(singleInstance)那么,A和B不是在一个栈中,也就没有先进后出的模式了,那么,它具体是怎么样的呢,下面我们详细介绍下

SingleInstance 定义

SingleInstance比较特殊,是全局单例模式,是一种加强的SingleTask模式。它除了具有它所有特性外,还加强了一点,具有此模式的Activity仅仅能单独位于一个任务栈中。

指定为SingleInstance模式的活动会启用一个新的返回栈来管理这个活动(其实如果singleTask模式指定了不同的taskAffinity,也会启动一个新的返回栈);并且该返回栈中只放入这一个活动。

  在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。使用场景如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。

SingleInstance使用说明

废话不多说,直接上代码,看看效果如何,布局就不贴了,简单的写个按钮就好了,这次我们创建3个Activity,FirstActivity,SecondActivity,ThirdActivity,分别在清单里,设置launchMode为Standard,SingleInstance,Standard

<activity
    android:name=".FirstActivity"
    android:screenOrientation="portrait" />
    <activity
    android:name=".SecondActivity"
    android:launchMode="SingleInstance"
    android:screenOrientation="portrait" />
    <activity
    android:name=".ThirdActivity"
    android:screenOrientation="portrait" />

在onCreate方法中设置跳转:

 //添加点击事件
 firstBtn.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View view) {
    //启动SecondActivity活动
    Intent intent = new Intent(MainActivity.this,SecondActivity.class);
    //启动活动
    startActivity(intent);
   }
  });
 
 //添加点击事件
  secondBtn.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View view) {
    //启动ThirdActivity活动
    Intent intent = new Intent(MainActivity.this,ThirdActivity.class);
    //启动活动
    startActivity(intent);
   }
  });

运行demo后,点击firstBtn,secondBtn,查看打印日志信息

I/TAG: FirstActivity is launched; and this stack id is: 22
I/TAG: SecondActivity is launched; and this stack id is: 23
I/TAG: ThirdActivity is launched; and this stack id is: 22

我们可以看到,FirstActivity和ThirdActivity在一个返回栈中,SecondActivity是单独的栈, 因此呢,设置为SingleInstance启动模式的活动会单独创建一个返回栈。

然后在点击返回按钮,直到退出,查看打印日志信息如下

I/TAG:ThirdActivity is destroyed !
I/TAG:FirstActivity is Destroyed !
I/TAG:SecondActivity is destroyed ! 点击返回按钮后,销毁的顺序FirstActivity-》ThirdActivity-》SecondActivity,按照启动顺序应该是 FirstActivity-》SecondActivity-》ThirdActivity,但是因为设置了singleInstance,点击返回之后,顺序却不是按照启动顺序,因为ThirdActivity处在22号栈,当出栈之后,发现该栈中还有Activity在,于是先将该栈中的Activity全部出栈之后,然后在对另一个栈23进行出栈出理。如果我们只启动FirstActivity和SecondActivity,那么依旧是SecondActivity先出栈,然后再试FirstActivity。

图解如下:

image.png

看了图解之后,应该更加清楚明白了吧,这就是singleInstance,说他是加强的SingleTask模式,意思就是根singleTask的模式很相似,开发中很少用的singleInstance, 大家可以作为了解内容,知道它的原理就好了,因为启动模式在Android开发中还是很重要的,面试也是必问项

最后一种启动模式也介绍完了,有什么说的不对的地方还请指正,欢迎留言评论