singletask和onNewintent

singletask和onNewintent当activity属性设置为singletask时,如果按home键,然后重新启动该activity,理应走到onNewIntent()中去,但是在搞music时发现并非如此,虽然mediaplaybackactivity设置为singletask,但是当按home键后,如果再次通过playlistactivity启动,仍走的是onresume。这样新的intent就无法传过来。修

大家好,又见面了,我是你们的朋友全栈君。

当activity属性设置为singletask时,如果按home键,然后重新启动该activity,理应走到onNewIntent()中去,但是在搞music时发现并非如此,

虽然mediaplaybackactivity设置为singletask,但是当按home键后,如果再次通过playlistactivity启动,仍走的是onresume。这样新的intent就无法传过来。

修改menifest属性,加上android:taskAffinity=””

                android:taskAffinity=””
                android:launchMode=”singleTask”

发现这样就可以走onNewIntent。

不过这样也有一个弊端,那就是在mediaplaybackactivity界面按home键,再点击音乐时不会回到原来界面。

原因。。。。?

原因是

                android:taskAffinity=””
                android:launchMode=”singleTask”

会让该activity单独起一个task。这样如果安息home键在点击音乐,会启动音乐的task,而mediaplaybackactivity是在另外的task上,所以无法启动。

因此以上两个属性很类似与singleinstance。

注:  android:taskAffinity=””的意思是不依附于任何task,也就是自己新建一个task。

具体可以参考下面的文章:

转自http://hi.baidu.com/amauri3389/blog/item/a54475c2a4b2f040b219a86a.html

参见:http://mypyg.iteye.com/blog/919643 

        http://marshal.easymorse.com/archives/2950 

        http://blog.csdn.net/infsafe/article/details/5666964

Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance。以下逐一举例说明他们的区别:

 

standard:Activity的默认加载方法,即使某个Activity在Task栈中已经存在,另一个activity通过Intent跳转到该activity,同样会新创建一个实例压入栈中。例如:现在栈的情况为:A B C D,在D这个Activity中通过Intent跳转到D,那么现在的栈情况为: A B C D D 。此时如果栈顶的D通过Intent跳转到B,则栈情况为:A B C D D B。此时如果依次按返回键,D  D C B A将会依次弹出栈而显示在界面上。

 

singleTop:如果某个Activity的Launch mode设置成singleTop,那么当该Activity位于栈顶的时候,再通过Intent跳转到本身这个Activity,则将不会创建一个新的实例压入栈中。例如:现在栈的情况为:A B C D。D的Launch mode设置成了singleTop,那么在D中启动Intent跳转到D,那么将不会新创建一个D的实例压入栈中,此时栈的情况依然为:A B C D。但是如果此时B的模式也是singleTop,D跳转到B,那么则会新建一个B的实例压入栈中,因为此时B不是位于栈顶,此时栈的情况就变成了:A B C D B。

 

singleTask:如果某个Activity是singleTask模式,那么Task栈中将会只有一个该Activity的实例。例如:现在栈的情况为:A B C D。B的Launch mode为singleTask,此时D通过Intent跳转到B,则栈的情况变成了:A B。而C和D被弹出销毁了,也就是说位于B之上的实例都被销毁了。

关于singleTask这个网上颇有争议,包括google api上的说明也让我看的是一头雾水,自己用实例亲测,终于算是搞清楚了

正解:1.singleTask 并不一定处于栈底

   2.singleTask 并一定会是栈底的根元素 

    3.singleTask 并不一定会启动新的task  

     情况一:如果在本程序中启动singleTask的activity:假设ActivityA是程序的入口,是默认的模式(standard),ActivityB是singleTask 模式,由ActivityA启动,刚ActivityB不会位于栈底,不是根元素,不会启动新的task,此种情况ActivityB会和ActivityA在一个栈中,位于ActivityA上面

  情况二:如果ActivityB由另外一个程序启动:假设apkA是情况一中的应用,apkB是测试程序,在apkB中启动apkA中的ActivityB,刚ActivityB会位于栈底,是根元素,会启动新的task

注意singleTask模式的Activity不管是位于栈顶还是栈底,再次运行这个Activity时,都会destory掉它上面的Activity来保证整个栈中只有一个自己,切记切记

singleInstance:将Activity压入一个新建的任务栈中。例如:Task栈1的情况为:A B C。C通过Intent跳转到D,而D的Launch mode为singleInstance,则将会新建一个Task栈2。此时Task栈1的情况还是为:A B C。Task栈2的情况为:D。此时屏幕界面显示D的内容,如果这时D又通过Intent跳转到D,则Task栈2中也不会新建一个D的实例,所以两个栈的情况也不会变化。而如果D跳转到C,则栈1的情况变成了:A B C C,因为C的Launch mode为standard,此时如果再按返回键,则栈1变成:A B C。也就是说现在界面还显示C的内容,不是D。

好了,现在有一个问题就是这时这种情况下如果用户点击了Home键,则再也回不到D的即时界面了。如果想解决这个问题,可以为D在Manifest.xml文件中的声明加上:

 

<intent-filter>

       <action android:name=”android.intent.action.MAIN” />

        <category android:name=”android.intent.category.LAUNCHER” />

 </intent-filter>

 

加上这段之后,也就是说该程序中有两个这种声明,另一个就是那个正常的根activity,在打成apk包安装之后,在程序列表中能看到两个图标,但是如果都运行的话,在任务管理器中其实也只有一个。上面的情况点击D的那个图标就能回到它的即时界面(比如一个EditText,以前输入的内容,现在回到之后依然存在)。

 

PS:intent-filter中 <action android:name=”android.intent.action.MAIN” />和 <category android:name=”android.intent.category.LAUNCHER” />两个过滤条件缺一不可才会在程序列表中添加一个图标,图标下的显示文字是android:label设定的字符串。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153246.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 图片变透明之opacity属性

    图片变透明之opacity属性CSS3图像透明度开发工具与关键技术:DW-opacity属性作者:徐晶旗撰写时间:2019年1月18日利用opacity属性来改变图片的透明度,opacity属性能够设置的值从0.0到1.0。值越小,图片越透明。下面这几张图片是执行代码得出的效果,第一张图片没有给它设置opacity值,所以它呈现的是原图,没有透明的效果,后面几张图设置的opacity值越来越小,可…

    2022年5月26日
    27
  • 2021.9 idea MyBatis Log Plugin 激活码(JetBrains全家桶)

    (2021.9 idea MyBatis Log Plugin 激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月26日
    93
  • CEGUI编译

    CEGUI编译CEGUI版本0.8.2依赖库使用cegui-deps-0.8.x-src由于我是要在Ogre中使用CEGUI做界面,所以渲染引擎使用Ogre,编译的Ogre版本1.9CEGUI和cegui-deps-0.8.x-src都能通过cmake创建vs项目先编译cegui-deps-0.8.x-src,使用cmake生成vs解决方案,因为不依赖别的库,所以不需要怎么配置,直接co

    2022年7月24日
    9
  • 高通msm8937的BLSP学习

    高通msm8937的BLSP学习1.基础概念(1)  BusAccessModule(BAM),总线访问模块BAMisusedtomovedatato/fromtheperipheralbuffers.(2)  BAMLow-SpeedPeripheral(BLSP),低速接口的总线访问模块(3)  QUP:QualcommUniversalPeripheral,高通统一的…

    2022年10月19日
    2
  • logback-spring.xml配置文件(最佳实践)

    logback-spring.xml配置文件(最佳实践)logback-spring.xml配置文件&amp;amp;amp;lt;?xmlversion=&amp;amp;quot;1.0&amp;amp;quot;encoding=&amp;amp;quot;UTF-8&amp;amp;quot;?&amp;amp;amp;gt;&amp;amp;amp;lt;!–日志级别从低到高分为TRACE&amp;amp;amp;lt;DEBUG&amp;amp;amp;l

    2025年6月30日
    3
  • prolog实例_prolog实例

    prolog实例_prolog实例这是保存到文件的代码如下:room(kitchen).room(office).room(hall).room(‘diningroom’).room(cellar).door(office,hall).door(kitchen,office).door(hall,’diningroom’).door(kitchen,cellar).door(‘dining

    2025年5月28日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号