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设定的字符串。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • git的一个分支在本地修改了很多,怎么能直接将本地的直接push到git的另外一个分支呢

    git的一个分支在本地修改了很多,怎么能直接将本地的直接push到git的另外一个分支呢

  • 【软件资源】VS2013软件安装全教程!(附VS各版本下载地址)

    【软件资源】VS2013软件安装全教程!(附VS各版本下载地址)VisualStudio(简称VS)是微软公司旗下最重要的软件集成开发工具产品。是目前最流行的Windows平台应用程序开发环境,也是无数人学习编程的入门软件之一。VisualStudio可以用来创建Windows平台下的Windows应用程序和网络应用程序,也可以用来创建网络服务、智能设备应用程序和Office插件,目前还可开发安卓平台应用及IOS平台应用。【软件名称】:VisualStudio2013【安装环境】:Win7/Win8/Win10联网【下载链接】.

  • copy.deepcopy()_python切片是深拷贝还是浅拷贝

    copy.deepcopy()_python切片是深拷贝还是浅拷贝copy()与deepcopy()之间的主要区别是python对数据的存储方式。首先直接上结论:—–我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。—–而浅复制并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化

  • java中分页查询的实现_java中分页实现步骤图解

    java中分页查询的实现_java中分页实现步骤图解java分页查询的实现分页要传入当前所在页数和每页显示记录数,再分页查询数据库,部分代码如下所示。传入参数实体类:publicclassMessageReq{privateStringmemberId;//会员idprivateintcurrentPage;//当前页privateintpageSize;//一页多少条记录privateint

  • 金融大数据平台建设_智慧银行数字化运营大赛

    金融大数据平台建设_智慧银行数字化运营大赛来源:方案经理选编:秀方案网https://www.fangan100.com/fangan/1213.html互联网金融的本质是金融,核心是数据,载体是平台,关键是客户体验,发展趋势是互联网与金融的深度融合,要提升大数据贡献度。探索银行业务创新,实现数据资源的综合应用、深度应用,已成为提升企业核心竞争力,实现企业信息化可持续发展的关键途径。大数据技术在银行业的应用范围包括:客户洞察、营销…

  • VC中实现文字竖排的简单方法

    好多人都觉得在VC中实现文字竖排是一件很难的事情,其实可以使用“躺”着的字体很方便的实现文字竖排。Windows中有一些字体是“躺”着的,例如:@Fixedsys、@System、@宋体、@黑体等等

    2021年12月24日

发表回复

您的电子邮箱地址不会被公开。

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