频道栏目
首页 > 程序开发 > 移动开发 > Android > 正文
Android启动模式总结
2016-10-19 09:23:34         来源:wenzhi的博客  
收藏   我要投稿

启动模式:LaunchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用一个task里。

这里简单介绍一下任务栈task的概念,task是一个具有栈结构的对象,一个task可以管理多个Activity,启动一个应用,也就创建一个与之对应的task。任务栈里面的Activity是按照先进后出的形式保存的,比如:你打开一个页面,在页面中打开另一个页面,另一个页面退出后,返回的是第一个打开的页面,这就是任务栈的简单原来。

但是在实际程序中多次页面跳转后,不想再回到上次打开的页面,这时候页面显示的启动模式就很有必要了。

Activity一共有以下四种launchMode启动模式:

1.standard

2.singleTop

3.singleTask

4.singleInstance

我们可以在AndroidManifest.xml配置的android:launchMode属性为以上四种之一即可。如图所示:

 

launchMode

 

下面分别介绍这四种启动模式。

这里要先理解栈顶的概念:只要是页面刚打开,不管他是什么模式的,它都是栈顶页面。

栈底的概念虽然书上没说,但是要理解透彻栈的模式,还是要知道有这个说法,比如:首先打开的页面是位于最底下的,然后后面打开的页面一次往上堆。只有最底下的页面关闭,程序才算完成关闭。

一.四种启动模式的概念和理解

(一)standard标准模式

是默认的启动模式,不用为配置android:launchMode属性即可,当然也可以指定值为standard。
每次启动standard模式的Activity时,都创建Activity实例,并放入任务栈;
简单的理解:如果几个页面都是standard模式启动的,那么页面无论是跳转到别的页面还是自己跳转到自己页面,跳转多少次后,就要点击多少次退出键最后才能关闭所有的。

(二)SingleTop栈顶单例模式

指定属性android:launchMode=”singleTop”,系统就会按照singleTop启动模式处理跳转行为。这个在实际中并不常用。
如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,只需复用自己已有的Activity示例即可。但是如果自己不是栈顶的话,还是会创建自己的示例的。
简单的理解:如果页面的启动类型是SingleTop类型的,它点击跳转到自己的页面,只需要点击一次退出就退出程序了。因为当它处于栈顶时,它无论点击多少次跳转到自己,都自有一个Activity实例,点击一次退出就会退出程序。和Standard模式对比的话,Standard模式下点击多少次自己就要退出多少次后才能退出程序。

(三)SingleTask内单例模式

指定属性android:launchMode=”singleleTask”,这是应用中比较常用到的模式。也是我们要重点理解的模式。
如果要启动的那个SingleTask模式的Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都移出栈里面;如果不存在该模式的Activity就创建给模式的Activity放在该栈顶。也就是说:一个栈里面只能有一个SingleTask模式的Activity。
上面几句重点理解一下:
如果SingleTask模式的Activity已经存在栈顶,那么再次跳转到自己页面,它是不会创建自己的Activity实例对象的,这个和SingleTop是一样的。
但是如果SingleTask模式的Activity已经不在栈顶,那么再次跳转到自己页面,它是不会创建自己的Activity实例对象的,也会直接跳转到自己的实例Activity,并且把压在该模式之上的所有Activity实例都移除栈,但是该模式底下的Activity实例它是没有办法移除的。
如果SingleTask模式的Activity都还没有创建,那么它会新建它的Activity实例对象,并把自己放在栈顶,这个和所有的Activity实例对象都是一样的。
关于SingleTask的应用是特别值得注意的,比如主页面的设计一般使用SingleTask模式来设计,因为用户点击多次页面的相互跳转后,在点击回到主页,再次点击退出,这时他的实际需求就是要退出程序,而不是一次一次关闭刚才跳转过的页面,最后才退出。这就需要用到SingleTask模式。

(四)SingleInstance全局单例模式

指定属性android:launchMode=”singleleInstance”。
该模式下,无论是从哪一个任务栈Task中启动Activity,只会创建一个目标的Activity实例,并且使用一个全新的Task栈来加载该Activity实例。
可以看出SingleInstance模式比SingleTask模式更加霸道,打开一个SingleTask模式的Activity,它如果已经存在它会把在它之上的该Task里面的Activity实例移除;而打开SingleInstance模式的Activity,不管它存不存在,他都会新建一个Task,把自己放在里面,也就就是说刚打开的SingleInstance的Activity在自己新建的栈里面只有自己一个实例对象。
但是它和新建自己的Task时,是不会移除自己之前Activity实例上面或下面的Activity实例,之前的Task里面的Activity依然存在。
如果应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例;
SingleInstance模式一般是用于资源的共享。比如有软件A打开的QQ和用软件B打开的QQ是打开的是同一个QQ软件。并且退出QQ程序后,原来打开的程序并没有被关闭。
这就是SingleInstance模式作用。

编程程序加强理解">二.编程程序加强理解

本程序只是简单页面的跳转,用来验证上面的模式的正确性和加强对模式过程的理解。
本程序设计一份之后简单复制就可以完成。
设计后的结果:四个Activity和四个布局文件,如图所示:
文件创建

(一)布局文件activity.xml的设计




    


其中上面的TextView控件的内容要改为该页面设计的模式名。

 

(二)MainActivity.java文件代码的设计

package com.example.android;
import android.content.Intent;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.view.View;

public class MainActivity extends Activity {

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

    //跳转到MainActivity页面
    public void ToMainActivity(View v) {
        startActivity(new Intent(this, MainActivity.class));
    }

    //跳转到SingleTopActivity页面
    public void ToSingleTopActivity(View v) {
        startActivity(new Intent(this, SingleTopActivity.class));
    }

    //跳转到SingleTaskActivity页面
    public void ToSingleTaskActivity(View v) {
        startActivity(new Intent(this, SingleTaskActivity.class));
    }

    //跳转到SingleInstanceActivity页面
    public void ToSingleInstanceActivity(View v) {
        startActivity(new Intent(this, SingleInstanceActivity.class));
    }

    //关闭页面页面
    public void ToFinish(View v) {
        finish();
    }


   }


四个Activity文件的文件名换一下就可以了。
 

(三)程序运行前要设置AndroidManifest.xml,如下:


    
        

        
    




前面一个activity是系统默认添加的,后面三个activity是要自己手动添加的

(四)程序运行后的结果:

cuxu
程序启动后点击各个模式试一下,最后每次点击关闭页面,看看退出的顺序是否是你所想的?要弄清过程就可以。
一些简单的逻辑顺序,比如:
1.比如多次点击主页面按钮,要多次点击关闭页面按钮才能退出程序。
2.点击ToSingleTask模式的页面后,无论你点击多少次,去主页面的按钮或ToSingTop按钮,再点击一次ToSingleTask按钮后,点击关闭页面按钮后,退回的是standard模式页面,再次点击关闭页面按钮后将退出程序。
3.后面也可以改变程序的最开始启动的页面的启动模式,再看看运行的效果。

三.Android启动模式相关的知识

(一)退出单个Activity方法:

1.调用finish

2.杀死该进程:killprocess(Process.mId)

(二)退出整个应用:

1.制造抛异常导致整个程序退出

2.将所有的activity放入到一个list中,然后在需要退出的时候,将所有的activity,finish掉

3.通过广播来完成退出功能

通过广播来完成退出功能,具体实现过程是这样的:在每个Activity创建时(onCreate时)给Activity注册一个广播接收器,当退出时发送该广播即可。

点击复制链接 与好友分享!回本站首页
相关TAG标签 Android 启动模式
上一篇:Android面试题整理(1)
下一篇:android之帧动画和补间动画
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站