Android之启动模式

启动模式有哪些

在Android的launchMode中有四个可选模式,分别是singleTop,singleTask,standard,singleInstance,它们分别代表一个activity的几种打开方式,或者叫存在方式。Android中的activity栈采用层级式显示,旧的页面在下层,新打开的页面铺盖在上层,返回的时候好似剥洋葱一层层的揭开,但是实际业务总是千奇百怪,纷繁复杂,总有些逻辑是非常规的。

singleTop

设置了SingleTop这种模式的Activity,在在Activity栈中并不确保独一性,只有当该Activity处于栈顶的时候才不会新建,如果不在栈顶,Android同样会重新创建该Activity实例。

singleTask

设置了SingleTask这种模式的Activity,会在Activity栈中会保持独一性,同一个Activity实例无论你打开多少次都不会重复创建。而且凡是覆盖在其上层的Activity都会被销毁。这样的好处是避免创建过多重复的页面,当然需要注意数据的保存和处理。所以就可能会有这样的问题,使用场景:

使用其他应用打开app的某个页面,清单文件中配置intent。

1、首先需要把这个activity的启动模式设置为singletask。这样能调出该页面。

2、但是启动模式设置完后会出现,当页面没有销毁的时候调用,此时获取不到intent传过来的值。主要是因为此时oncreate方法并不执行

解决方案:
当Activity启动模式为singletask的时候,重新启动这个Activity假如该Activity对象存在,Activity的生命周期为
onNewIntent --》 onRestart --》onStart --》onResume,就不会走onCreate方法,我们调用getIntent也就获取不到这次的intent值,为了获取正确的intent需要重写该方法,并调用setIntent(intent)设置这个传来的最新的intent。

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}

注:系统可能会杀死后台运行的activity,如果该activity被杀掉此时会调用onCreate()方法而不会调用onNewIntent()方法,所以最好在onCreate中也做相应的处理

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //获取传递intent值
    Intent intent = getIntent();
  	intent.getStringExtra("XXX","XXX");
}

standard

standard就相当于点一个链接打开一个新的标签页,Android中表示每次都新建一个Activity实例,打开一个Activity就新建一个页面,这个没什么好讲的。

singleInstance

拿浏览器的操作来对比的话,singleInstance就是在新窗口中打开,打开后就会有两个窗口并列显示,Android中会新开辟一个activity栈。这种模式很有意思,使用singleInstance的Activity会造成一个现象,当你查看最近任务时,部分手机会出现一个app有两个选项卡的情况,让人觉得是两个app一样(当然这种情况也可以避免),另外当你做返回操作的时候很可能并不是回到上一页面,而是退出app了,所以它的退出操作需要做特殊处理(当然它打开其他页面时也要做特殊处理)。这种方式适用于缓存页面,比如有些播放视频或者音频的页面,你想要按返回键时继续播放,想通过全局悬浮窗随时打开,想打开时又不总是新建页面,那这个就太合适了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值