Android组件之Activity栈与加载模式

来源:互联网 发布:淘宝贷款10万一年利息 编辑:程序博客网 时间:2024/06/04 17:45

1、Activity栈

        从上一篇文章Android组件之Activity生命周期解析中,我们知道Activity是有多种状态的,那么,Activity的状态更改是由谁来控制的呢?这里,我们要提到一个在数据结构中常用的概念,叫做栈。

        这里提到的栈,是一个后进先出LIFO,包含所有正在运行Activity的队列,每个Activity的状态是由它在Activity栈中的位置决定的。当一个新的Activity启动时,这个Activity将会移到Activity栈的顶部,显示给用户。如果用户使用后退按钮返回的话,或者该Activity被前台的Activity结束,活动的Activity就会被移出栈而消亡,原本在栈顶的下一个活动的(以前笔者曾经提到过一个活跃的进程这样的一个概念,不过那个时候我的一些Liunx的前辈却不认同,但是我认为我的理解是准确的,不知道大家以为如何)Activity将会移上来并变为活动状态。

        这里,我借用一副网络上的图片,做一个简单的说明:


       上面这幅图能够形象的解释,我在之前说明的Activity栈的管理模式,大家可以认真琢磨一下。这幅图示,对于我们在代码中自己管理Activity有意想不到的作用,接下来我们介绍一下栈在实际开发中的一个比较经典的使用案例。

 2、基于栈的完全退出

       我们在做实际的app开发过程中,有时候会遇到要让应用完全退出的情况?有没有比较好的方法呢?通过上面我们对Activity栈的了解,相比大家已经有了答案,没错,这里我们介绍一种比较流行的解决方案。当然,也还有其它解决方法,大家可以自行搜索,这不是本文讨论的重点。

/** * application是作为全局存在的 * @author test * */public class MyApplication extends Application {private List<Activity> activityList = new LinkedList<Activity>();private MyApplication() {}// 添加Activity到容器中public void addActivity(Activity activity) {activityList.add(activity);}// 遍历所有Activity并finishpublic void exit() {for (Activity activity : activityList) {activity.finish();}System.exit(0);}}

3、四种加载模式

        3.1 概念与配置

        首先,我们来了解一下,Activity一共有哪些加载模式:standard, singleTop, singleTask, singleInstance。

        对于这种加载模式,Android是如何识别判断的呢?如果进行过Android开发的同学,应该已经了解到了,一般,我们在初始化Activity都是通过的xml文件,而Android的主xml文件就是mainfest文件,下面的代码,给出一个Activit的配置方法:

         <activity            android:name=".MainActivity"            android:launchMode="standard"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>
       上文给出一个Activity的标准加载模式。仔细一点的同学已经看出来了,实际上就是launchMode属性的设置。

       3.2 模式区别

       standard:这里是指标准模式,也是Android系统默认的模式,如果一个Activity没有指定模式,系统会默认使用这种模式。它就是上文中Activity栈的表现形式,如果有新的Activity产生,它会被添加到栈顶;如果新的Activity移除,那么之前的Activity会出栈到栈顶。

       singleTop:singleTop 跟standard 的使用基本一样。唯一的区别就是,当跳转的对象是位于栈顶的activity(可以理解为用户眼前所看到的activity或者正在操作的Activity)时,程序将不会生成一个新的activity实例,而是直接跳到现存于栈顶的那个activity实例。

       下面给出一段代码,解释说明一下上面两者的区别:

 startActivity(new Intent(ActA.this, ActA.class));
       为了简便,我这里直接使用A来描述,本段代码是从A跳转到A。那么如果是standard模式,那么后面的A是一个新产生的Activity。但是如果是使用的singleTop模式,后面的A不会产生,因为我们使用了栈顶单一模式。再深入说明,就是,如果使用的是standard模式,你多点击几次按钮,会产生多个Activity在栈顶(当然会覆盖),你在退出的时候,会发现自己需要多次退出才完全退出。但是你使用了singleTop模式,你按一次退出,就退出Activity了。

       我想已经说明白二者的区别了,现在我们接着说一下剩下的两者,singleTask和singleInstance都是在系统中只存在一个实例。

       singleTask:从intent到来,需要创建singleTask模式Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有(不论你是否在栈顶)直接将intent发送给它。这种模式保证了系统中只存在一个这样的实例。

       singleInstance:这个模式的说明网上有很多比较复杂的说法,我不太喜欢,看到一个很简单的说明举例,我直接引用过来,希望帮助大家理解。该模式实际上是说,使用了这种模式加载的Activity拥有一个独立的task栈。我画了一个简单的图示说明下面的例子,希望帮助大家理解。

       现在有以下三个activity: Act1、Act2、Act3,其中Acti2 为 singleInstance 模式。它们之间的跳转关系为: Act1 -- Act2 -- Act3 ,现在在Act3中按下返回键,由于Act2位于一个独立的task中,它不属于Act3的上下文activity,所以此时将直接返回到Act1。


       左边是我们的一般情况,右手边的两个是我们现在说明的情况,ActivityB在一个单独的栈队列中,所以在退出的时候,直接从ActivityC返回到ActivityA。



0 0