一、singleInstance常见应用场景:
①手机拨号界面(QQ、短信这种涉及数字的都会用到手机拨号界面)
②社交APP分享页面(微信、QQ、知乎)
——作为外部App调用自己客户端程序的入口的Activity都会采用singleInstance启动模式。
以下以社交分享页面为例:
上述图片中描绘了从相册分享图片到微信好友的整个过程共7张图,7个步骤:
①打开小米手机相册APP,选中一张图片;
②选中图片之后,选择发送到微信;
③微信此时出现界面为发送选择界面,(这个活动界面的启动方式就是singleInstance);
④点击选中“文件传输助手”弹出发送确认对话框;
⑤点击“发送”,进入文件传输助手对话框,并完成照片的发送;
⑥点击back按键(笔者使用的米4,有返回键),回退到微信主活动界面;
⑦再次点击back按键,回退出微信APP,回到相册APP原始界面中。
请问:最关键的Activity是哪一个?其使用的是哪种启动模式?为什么?
解答:最为关键的是第三张图代表的Activity,微信发送选择界面,其启动模式为singleInstance。因为正常情况下,只有采用这种启动模式的活动界面才会被设置成为共享Activity,方便其他Activity和其他应用程序进行共享。
感兴趣的读者可以在思考两个问题:
1)两次按back键回退,其出栈方式分别是什么样的?
2)在微信内部,发送图片给好友,会发生什么情况,和跨应用有什么不同的地方吗?
3)打开音乐app,分享音乐到微信好友时,又会发生什么情况?
二、singleTask常用场景:
其在App内部适合作为程序入口点。从上面的介绍可以看出我们的App项目中调用较多的Activity页面使用于该启动模式,在项目中我们哪个Activity用的多?当然是首界面HomeActivity调用的较多,因此在首界面Activity的启动模式适用于改启动模式。当然其他利用较多的Activity也应该设置为该启动模式。
①浏览器首页Activity,整个任务栈只有一个实例,节约了内存;
②购物APP宝贝展示界面01,界面02确认订单,界面03付款,如果付款成功会自动跳到界面01,如果付款失败则返回界面02,这个时候重启01就是用的singleTask启动模式。
三、singleTop常用场景:
①某网易云课堂APP,每次联网之后经常会一口气收到N多个通知,点开其中一个,开始播放视频,看完了点开第二个通知,会直接在原来界面上刷新视频,而不会再次出现打开动作,这种对用户体验良好的界面播放形式就是采用了singleTop启动模式;
②某日头条新闻app,和通知相关的操作也是一样;
③便签/小说APP的设置界面,比如第一次设置好了字体大小,然后开始写作/阅读,觉得不行,字体还是太小了,第二次打开设置,去把字体改大。这个时候设置界面的启动模式就是singleTop了,因为这个操作一般来说是不频繁的,就算没有实例也可以重新创建,用其他启动方式反而是不合适的。
四、standard常用场景:
在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加,因此一般情况下我们不采用这样的启动方式,这样不但重建Activity对象造成耗时,而且也会造成内存的浪费。
但是在“某些内容可能随时更改”的app里常见,比如银行APP,依次打开“账户”“信用卡”“理财产品”会发现,每个界面的打开都需要刷新依次网络,请求最新的数据,然后在依次打开一遍,会发现,即使3秒钟前打开的Activity再次重新打开也是需要刷新网络的,可以推测,其界面的启动模式就是标准模式。
有关Activity四种启动模式的详细讲解,可以参考笔者的Activity四种启动模式及onNewIntent()方法、taskAffinity属性分析