Activity四种启动模式及应用场景

 

面试的时候科大讯飞的一个面试官问我Activity的启动模式和具体的应用模式;我也一想是啊,平时不太注意,只知道有这几个启动模式,结果到了关键的时刻卡壳了,做个记录:

一、Activity四种启动模式:
(一)、基本描述
standard:标准模式:如果在mainfest中不设置就默认standard;standard就是新建一个Activity就在栈中新建一个activity实例;
singleTop:栈顶复用模式:与standard相比栈顶复用可以有效减少activity重复创建对资源的消耗,但是这要根据具体情况而定,不能一概而论;
singleTask:栈内单例模式,栈内只有一个activity实例,栈内已存activity实例,在其他activity中start这个activity,Android直接把这个实例上面其他activity实例踢出栈GC掉;
singleInstance :堆内单例:整个手机操作系统里面只有一个实例存在就是内存单例;

在singleTop、singleTask、singleInstance 中如果在应用内存在Activity实例,并且再次发生startActivity(Intent intent)回到Activity后,由于并不是重新创建Activity而是复用栈中的实例,因此Activity再获取焦点后并没调用onCreate、onStart,而是直接调用了onNewIntent(Intent intent)函数;

二、Activity四种启动模式常见使用场景:
这也是面试中最为长见的面试题;当然也是个人工作经验和借鉴网友博文,如有错误纰漏尽请诸位批评指正;

LauchMode       Instance
standard             邮件、mainfest中没有配置就默认标准模式
singleTop           登录页面、WXPayEntryActivity、WXEntryActivity 、推送通知栏
singleTask         程序模块逻辑入口:主页面(Fragment的containerActivity)、WebView页面、扫一扫页面、电商中:购物界面,确认订单界面,付款界面
singleInstance    系统Launcher、锁屏键、来电显示等系统应用

二.启动模式的使用方式

1. 在 Manifest.xml中指定Activity启动模式

一种静态的指定方法,在Manifest.xml文件里声明Activity的同一时候指定它的启动模式,这样在代码中跳转时会依照指定的模式来创建Activity。样例例如以下:

 

 <activity android:name="..activity.MultiportActivity" android:launchMode="singleTask"/>

2. 启动Activity时。在Intent中指定启动模式去创建Activity

一种动态的启动模式,在new 一个Intent后,通过Intent的addFlags方法去动态指定一个启动模式。例如以下:

        Intent intent = new Intent();
        intent.setClass(context, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);

注意以上两种方式都能够为Activity指定启动模式,可是二者还是有差别的。

(1)优先级:动态指定方式即另外一种比第一种优先级要若两者同一时候存在,以另外一种方式为准。
(2)限定范围:第一种方式无法为Activity直接指定 FLAG_ACTIVITY_CLEAR_TOP 标识,另外一种方式无法为Activity指定 singleInstance 模式。

 

三. Activity 的 Flags

标记位既能够设定Activity的启动模式,如同上面介绍的,在动态指定启动模式,比方 FLAG_ACTIVITY_NEW_TASK 和FLAG_ACTIVITY_SINGLE_TOP 等。它还能够影响Activity 的运行状态 ,比方 FLAG_ACTIVITY_CLEAN_TOP 和 FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 等。

以下介绍几个基本的标记位,切勿死记,理解几个就可以,须要时再查官方文档。

1. FLAG_ACTIVITY_NEW_TASK

作用是为Activity指定 “SingleTask”启动模式。跟在AndroidMainfest.xml指定效果同样。

2. FLAG_ACTIVITY_SINGLE_TOP

作用是为Activity指定 “SingleTop”启动模式,跟在AndroidMainfest.xml指定效果同样。

3. FLAG_ACTIVITY_CLEAN_TOP

具有此标记位的Activity,启动时会将与该Activity在同一任务栈的其他Activity出栈。一般与SingleTask启动模式一起出现。它会完毕SingleTask的作用。但事实上SingleTask启动模式默认具有此标记位的作用

4.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

具有此标记位的Activity不会出如今历史Activity的列表中,使用场景:当某些情况下我们不希望用户通过历史列表回到Activity时,此标记位便体现了它的效果。它等同于在xml中指定Activity的属性:

 

android:excludeFromRecents="true"

四. 启动模式的实际应用场景

这四种模式中的Standard模式是最普通的一种,没有什么特别注意。而SingleInstance模式是整个系统的单例模式,在我们的应用中一般不会应用到。所以,这里就具体解说 SingleTop 和 SingleTask模式的运用场景:

1. SingleTask模式的运用场景

最常见的应用场景就是保持我们应用开启后仅仅有一个Activity的实例。最典型的样例就是应用中展示的主页(Home页)。

假设用户在主页跳转到其他页面,运行多次操作后想返回到主页,假设不使用SingleTask模式,在点击返回的过程中会多次看到主页,这明显就是设计不合理了。

1. SingleTask模式的运用场景
最常见的应用场景就是保持我们应用开启后仅仅有一个Activity的实例。最典型的样例就是应用中展示的主页(Home页)。

假设用户在主页跳转到其他页面,运行多次操作后想返回到主页,假设不使用SingleTask模式,在点击返回的过程中会多次看到主页,这明显就是设计不合理了。

2. SingleTop模式的运用场景
假设你在当前的Activity中又要启动同类型的Activity,此时建议将此类型Activity的启动模式指定为SingleTop,能够降低Activity的创建,节省内存!

/*
* 复用Activity时的生命周期回调
*/
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        initData();
        initView();
    }

当前singleTop模式的Activity正处于栈顶时,跳转该Activity会调用onNewintent方法且不会重新创建该Activity实例,只会重新调用该实例,生命周期为:onPause->onNewIntent->onResume 

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Android中,Activity四种启动模式,它们是: 1. standard模式:默认的启动模式,每次启动Activity都会创建一个新的实例,并放入任务栈中。如果多次启动同一个Activity,将会创建多个实例,并且放入不同的任务栈中。 2. singleTop模式:当启动一个Activity时,如果该Activity已经位于栈顶,则不会创建新的实例,而是直接使用已有的实例。如果不在栈顶,则会创建一个新的实例。这种模式适用于单例模式Activity,比如一个音乐播放器或者是一个消息通知栏。 3. singleTask模式:该模式下,每个任务栈中只能有一个该类型的Activity。如果要启动Activity已经存在于任务栈中,则不会重新创建新的实例,而是直接将该Activity调到栈顶。如果不存在,则会新建一个实例,并放入任务栈中。该模式适用于需要清除Activity栈中所有的Activity,只保留最后一个Activity的场景。 4. singleInstance模式:与singleTask模式类似,但是该模式下,该Activity只能位于一个独立的任务栈中。如果要启动Activity已经存在于该独立任务栈中,则不会重新创建新的实例,而是直接将该Activity调到栈顶。如果不存在,则会新建一个实例,并放入该独立任务栈中。该模式适用于需要共享资源的Activity,比如一个应用程序的主界面。 总之,四种启动模式各有不同,可以应用于不同的场景,开发者在使用时应该根据具体的需求来选择合适的启动模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值