Android四种启动模式的简单了解以及不同模式之间的Intent数据传递的区别

在处理Android项目的时候经常会出现多个activity之间的转换以及在activity转换的时候实现某些数据的传递,在启动每一个应用程序的时候系统都会创建一个任务栈个这个程序,然后程序里面的所有activity都会在加到这个任务栈里面来,有的时候我们需要去对这个栈里面的某一个特定的activity进行处理,这个时候就需要去对activity的启动模式进行处理:任务栈一共存在四种启动模式:

一:standard:系统默认的启动模式,不管activity是否重复都会像栈里加入activity,因此在按返回键时每次销毁一个activity,因此按多次销毁任务栈里所有的activity才会退出程序

二:singleTop模式:当一个activity指定为该模式时,在点击调用该activity时,会检测栈顶是否为该activity如果是就调用栈里的activity,否则才会重新创建一个新的activity放入栈里

三:singleTask:当一个activity指定为该模式时,在加载该activity时候会检测栈里是否有该activity,如果有则直接调用栈里的activity,同时销毁掉调用activity上面的所有activity

四:singleInstance:一个activity指定为该模式时,调用该activity时系统不会将activity放入默认的分配的任务栈,而是创建一个新的任务栈放入新的任务栈内。并在默认的任务栈内引用新任务栈里的该activity,当再次调用该activity时候再次引用新建栈内的activity,当按返回键销毁该activity时候就会销毁新任务栈内的该activity,并且销毁默认任务栈内的对该activity的所有引用

四种启动模式各有自己的适用场景,可以从其模式定义入手。

在项目中经常会遇见activity跳转时的数据传递问题,举个例子在启动模式为singleTask的时候从activity A 启动 activity B 再从activity B启动activity C最后从activityC启动activityA,与此同时从activityC使用Intent传递数据到activity A,这个时候应该怎么去获取穿过去的数据呢:

首先先来看看默认启动模式的情况下数据是怎么传递的吧:

这是在默认启动模式下清单文件中的配置

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity android:name=".OtherActivity" />
<activity android:name=".ThreeActivity"/>
这是三个activity的简单代码实现

这是在默认情况下在oncreate方法里面直接getIntent获取数据然后打印出来的数据

然后现在把启动模式修改为singleTask,这个时候可以很明显的看到日志并没有任何数据的打印,然后从在activity A直接点击返回键的情况下程序直接结束了。这是什么原因呢?

这是因为singleTask模式会检测当前的activity是含有该activity,如果有则直接调用栈里的activity,同时销毁掉调用activity上面的所有activity。至于数据为什么会得不到是因为在启动这个activity系统会先去查询这个栈中是否含有activity有就直接调用所以并不是生成一个新的activity。那么问题来了那我硬要实现这个功能应怎么办呢?别急接下来我们就说说解决办法:

activity中有一个onNewIntent()方法,当调用到onNewIntent(intent)的时候,需要在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent.否则,后续的getIntent()都是得到老的Intent


以上就是在这两种启动模式下的一些小区别,其他的模式有兴趣的可以自己去试试


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值