Activity的启动模式

30 篇文章 0 订阅
24 篇文章 0 订阅

活动的启动模式

activity 有四种启动模式:standard ;singleTop; singleTask singleInstance
可以在androidManifest.xml中的activity中Android:lanuchMode来设置:

standard :

一般我们默认就是standard模式:这种模式下系统不会在乎activity是否已经存在返回栈中,每次启动都会创建一个新的实例.
如:我们默认activityA的启动模式为standard ,A启动A,会再次创建A,所以退出程序时需要按两次back键.

singleTop:

在当前活动已经存在栈顶时,不会创建新的实例,如果不是还会创建实例:
A启动模式为singleTop
如:A-B-A,则会创建两个A实例,因为在B启动A时, B位于栈顶;如果A-A则会只有一个实例.

singleTask :

我们发现singleTop还是会出现多个实例,所以它也不是完全满足我们的需求,这时我们会发现singleTask模式:
每次启动活动的时候,都会在返回栈中检查是否已经存在了,如果不存在则创建; 如果存在的话,将此活动之前的活动退出返回栈,此活动就是栈顶了.
A启动模式为singleTask
如:A-B-A,这种情况返回栈中只有一个A,(B也不在返回栈了).

singleInstance:

这个启动模式与之前的三个都有所不同;会有单独的返回栈,
试想一下:如果我的这个活动是很多应用都会调用到的,那每个应用都有自己的返回栈,也会有这个活动的实例,造成多个实例,singleInstance就是解决这个问题的好办法.

B启动模式为singleInstance
如:A-B-C,这种情况有两个返回栈,一个返回栈中有A和C,另一个单独的B,此时按返回键先从C-A,然后在A-B,最后退出程序.

如何退出程序

如MainActivity打开Main2Activity,在打开Main3Activity,这时退出程序很麻烦,需要按三次返回键.

我们需要一个类来管理我们的活动ActivityCollector

public class ActivityCollector {
    public static List<Activity> sActivityList=new ArrayList<>();

    public static void AddActivity(Activity activity) {
       sActivityList.add(activity);
    }

    public static void removeActivity(Activity activity) {
        sActivityList.remove(activity);
    }

    public static void FinishAll() {
        for (Activity activity : sActivityList) {
            if (!activity.isFinishing()) {
                activity.finish();
            }
        }
    }
}

创建BaseActvity,继承AppCompatActivity,然后让MainActivity, Main2Activity Main3Activity都继承它

public class BaseActvity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityCollector.AddActivity(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }
}

此时在Main3Activity 只要按回退键就退出程序了

public class Main3Activity extends BaseActvity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        ActivityCollector.FinishAll();
        android.os.Process.killProcess(Process.myPid());//杀掉当前进程
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值