Android Activity 启动模式

来源:互联网 发布:视频会议录播软件 编辑:程序博客网 时间:2024/05/22 14:15

1. Standared模式(默认)

         我们平时直接创建的Activity都是这种模式的Activity,这种模式的Activity的特点是:只要你创建了Activity实例,一旦激活该Activity,则会向任务栈中加入新创建的实例,退出Activity则会在任务栈中销毁该实例。


2. SingleTop模式

        这种模式会考虑当前要激活的Activity实例在任务栈中是否正处于栈顶,如果处于栈顶则无需重新创建新的实例,会重用已存在的实例,否则会在任务栈中创建新的实例。

应用场景 :

        App程序中(或浏览器中)保存的书签,假如用户看到一个界面保存自己喜欢的标签,假如要保存10个,这个时候用户在返回键的时候,则会返回10次才能返回到App应用中, Android下singleTop 则解决该问题。


3. SingleTask模式

        如果任务栈中存在该模式的Activity实例,则把栈中该实例以上的Activity实例全部移除,调用该实例的newInstance()方法重用该Activity,使该实例处於栈顶位置,否则就重新创建一个新的Activity实例。

应用场景:

        如果一个App中,有一个功能需要加载网页内容 ,打开一个 browserActiviy现在网页内容,则内存开销非常大,首先要初始化webkit /c++ 嵌入式浏览器内核broweractivity 配置了singleTask,空间换时间,使用该模式可以节省内存开销。


4. SingleInstance模式

        当该模式Activity实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的Activity,都会通过调用实例的newInstance()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity

应用场景 :

        App各种词典,向有道词典,什么金山词典,说极端是因为不想被放置到同一个任务栈里面,它是全局的系统程序应用,达到节省内存的使用目的。 

 

总结:

1. 如何决定所属task
        “standard”和”singleTop”的activity的目标task,和收到的Intent的发送者在同一个task内,除非intent包括参数FLAG_ACTIVITY_NEW_TASK。
         如果提供了FLAG_ACTIVITY_NEW_TASK参数,可能会启动到别的task里。
        “singleTask”会查找是否存在合适的task(taskAffinity相同),有的话则在其中启动,且不一定是根Activity,没有的话新建一个task。
        ”singleInstance”总是把activity作为一个task的根元素,他们不会被启动到一个其他task里。
 
2. 是否允许多个实例
        “standard”和”singleTop”可以被实例化多次,并且可以存在于不同的task中,且一个task可以包括一个activity的多个实例;
        “singleTask”和”singleInstance”则限制只生成一个实例,并且singleInstance必须是task的根元素。
        singleTop要求如果创建intent的时候栈顶已经有要创建 的Activity的实例,则将intent发送给该实例,而不发送给新的实例。
 
3. 是否允许其它activity存在于本task内
        “singleInstance”独占一个task,其它activity不能存在那个task里;如果它启动了一个新的activity,不管新的activity的launch mode 如何,新的activity都将会到别的task里运行(如同加了FLAG_ACTIVITY_NEW_TASK参数)。而另外三种模式,则可以和其它activity共存。
 
4. 是否每次都生成新实例
        “standard”对于没一个启动Intent都会生成一个activity的新实例;“singleTop”的activity如果在task的栈顶的话,则不生成新的该activity的实例,直接使用栈顶的实例,否则,生成该activity的实例。比如现在task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动intent,如果D是 “standard”的,则生成D的一个新实例,栈变为A-B-C-D-D。如果D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D。如果这时候给B发Intent的话,不管B的launchmode是”standard” 还是 “singleTop” ,都会生成B的新实例,栈状态变为A-B-C-D-B。
        “singleInstance”是其所在栈的唯一activity,它会每次都被重用。
        “singleTask”如果在栈顶,则接受intent,如果不在栈顶,则会把它切换到前台,并销毁其上的Activity。

 

 

附:

退出单个Activity方法:

       调用finish

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

       终止正在运行的虚拟机:system.exit()

 

退出整个应用:

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

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

  通过广播来完成退出功能

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

 

@Overrideprotected void onCreate(Bundle savedInstanceState) {       super.onCreate(savedInstanceState);       IntentFilter filter = new IntentFilter();       filter.addAction("finish");       registerReceiver(mFinishReceiver, filter);       ……}private BroadcastReceiver mFinishReceiver = new BroadcastReceiver() {    @Override    public void onReceive(Context context, Intent intent) {           if("finish".equals(intent.getAction())) {              Log.e("#########", "I am " + getLocalClassName()                     + ",now finishing myself...");              finish();       }    }};
把上面的代码写在一个基类里面,这样,在需要退出的地方调用close,发送广播,每个Activity接收到广播后,就会将自己finish掉。

 

 

 


0 0