新手.activity启动器象棋怎么玩新手入门

启动其他APK的Activity方法 - Cynthia&Sky - 博客园
随笔 - 355, 文章 - 0, 评论 - 0, 引用 - 0
有两个app,分别叫做App1和App2。App1包含两个Activity,分别叫做App1_A和App1_B.其中App1_A是入口Activity.也就是App1_A设置intent-filter,action为&action android:name="android.intent.action.MAIN" /&App2只有一个Activity,叫做App2_A。现在在App2_A中通过startActivity启动App1_A是没问题的.但是启动App1_B的时候报了fc错误。logcat如下:08-03 02:23:44.119: WARN/ActivityManager(64): Permission denied: checkComponentPermission() reqUid=1003008-03 02:23:44.119: WARN/ActivityManager(64): Permission Denial: starting Intent { act=android.intent.action.VIEW cmp=com.hello/.activity2 } from ProcessRecord{407c8bc8 665:com.fileExplorer/10032} (pid=665, uid=10032) requires null
用法如下:Intent intent = new Intent(); ComponentName componentName = new ComponentName("com.hello","com.hello.App1_A");//这个没问题 //ComponentName componentName = new ComponentName("com.hello","com.hello.App1_B");//这个报错 intent.setComponent(componentName); startActivity(intent);
解决方法:(1)通过隐式intent调用方法实现,需要在被调用的activity的manifest文件中添加&intent-filter&&action android:name="com.example.project.SHOW_ACTIVITY" /&&category android:name="android.intent.category.DEFAULT" /&&/intent-filter&在StartActivity(it)之前,设定该intent对应的action(com.example.project.SHOW_ACTIVITY) Intent intent = new Intent();intent.setAction(action);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);推荐使用
利用setAction方法启动Activity还有一个好处就是不需要知道包名和Activity类名,只需要知道action就可以隐式的启动activity
(2)即使直接指定了目标activity的ComponentName,跨应用的activity调用也要至少给目标activity指定一个带action的filter。如:&intent-filter&
&action android:name="" /&&/intent-filter&action name为空即可。 (3)给被调用的Activity增加一个带action的filter,如下:&intent-filter&
&action android:name="com.sdmc.ottplayer.uercenter" /&&/intent-filter&然后可以通过隐式Intent来调用,而不用使用intent.setComponent方法,如下就OK了(但是经过验证,这种方法只是对APK的入口activity有用,对普通的没用,和上面的问题一样无法解决:启动其他APK的非入口activity)Intent i = new Intent("com.sdmc.ottplayer.uercenter");i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);this.startActivity(intent);
异常处理:Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?Context中有一个startActivity方法,Activity继承自Context,重载了startActivity方法。如果使用 Activity的startActivity方法,不会有任何限制,而如果使用Context的startActivity方法的话,就需要开启一个新 的task,遇到上面那个异常的,都是因为使用了Context的startActivity方法。解决办法是,加一个flag。intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
Intent intent = new Intent();intent.setClass(mContext, VideoPlayer.class);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);mContext.startActivity(intent);B&&if( taskAffinity 属性相同) {& &&&A 和 B 在同一个 Task 中&&}&&else {& &&&B 在新的 Task 中,并且此 Task 的 affinity 属性值就是 B 的&&}[/code]& && & 那么这个例子中, A 跳转 B, B 的启动模式是 “singleTask” , 并且 B 的 taskAffinity 不是 “cn.six.adv” 。 所以 B 会在一个新建的 Task 中。
& && && && &&&Task 1 (affinity=”cn.six.adv”)& &&&Task 2 (affinity=”task2″)& && && && && && & A& &&&B& && && &&&3. A(default) -> B(singleTask) -> C(singleTask) -> B(singleTask)
&&manifest 如下:
& && && &[code]& & & & & & [/code]& && & (1). A -> B
& && && && &&&Task 1 (affinity=”cn.six.adv”)& &&&Task 2 (affinity=”task2″)& && && && && && & A& &&&B& && && &&&(2) A -> B -> C
&&因为 C 的 affinity 是 “task2” ,而 Task 中已经有一个和它一样属性值的 B ,所以 C 会被放在 Task 2 中。
& && && && &&&Task 1 (affinity=”cn.six.adv”)& &&&Task 2 (affinity=”task2″)& && && && && && & A& &&&C B& && && &&&(3) A -> B -> C -> B
&&首先看一下实际结果
& && && && &&&Task 1 (affinity=”cn.six.adv”)& &&&Task 2 (affinity=”task2″)& && && && && && & A& &&&B& && && &&&好奇怪啊! C 去哪里啦?
& &事情呢,是这个样子滴。 C->B , B 的启动模式是 singleTask 而且它的 affinity 属性值是 “task2”, 当系统发现有一个 affinity 属性值为 task2 的 Task 2 所以就把 B 放进去了。但是, 其中已经有一个 B 的实例在 Task 2 之中。 所以系统会将已有的 B 的实例赋予一个 CLEAR_TOP (清除顶部)标志。所以 C 是这么没的。
&&4. SingleTask 小结
& && && &[code]if( 发现一个 Task 的 affinity == Activity 的 affinity ){& & if(此 Activity 的实例已经在这个 Task 中){& && &&&这个 Activity 启动并且清除顶部的 Acitivity ,通过标识 CLEAR_TOP& &&&} else {& && &&&在这个 Task 中新建这个 Activity 实例& & }} else { // Task 的 affinity 属性值与 Activity 不一样& & 新建一个 affinity 属性值与之相等的 Task& & 新建一个 Activity 的实例并且将其放入这个 Task 之中}[/code]& && & SingleInstance
&&SingleInstance 要比 SingleTask 好理解很多。
&&如果一个 Activity 的启动模式为 SingleInstance, 那么这个 Activity 必定会在一个新的 Task 之中, 并且这个 Task 之中有且只能有一个 Activity 。
&&再来一波栗子。
&&1. A(default) –> B(singleInstance) –> C(default)
&&(1). A -> B
& && && && &&&Task 1& &&&Task 2& && && && && && & A& &&&B& && && &&&(2). A -> B -> C
& &拥有 “singleInstance” 启动模式的 activity 不予许其他任何 Activity 在它的 Task 之中。所以它是这个 Task 之中的独苗啊。当它跳转另外一个 activity 时, 那个 Activity 将会被分配到另外一个 Task 之中——就像是 intent 被赋予了 FLAG_ACTIVITY_NEW_TASK 标志一样。
&&由于 B 需要一个只能容纳它的 Task , 所以 C 会被加上一个 FLAG_ACTIVITY_NEW_TASK 标识。所以 C(default) 变成了 C(singleTask) 。
&&然后结果变成了这样:
& && && && &&&Task 1& &&&Task 2& && && && && && & c A& &&&B& && && &&&注:如果跳转的流程是 “A(default) –> B(singleTask) –> C(default)”, 那么结果会是这样:
& && && && &&&Task 1& &&&Task 2& && && && && && & A& &&&C B& && && &&&如何去运用启动模式呢?
&&假如, 你需要在 service 在后台中做一些耗时操作,当它完成时, 你需要从此 service 中跳转进入一个 Activity 中,你会怎样做?
& &Service 是 Context 一种扩展, 它含有 startActivity(intent) 方法。但是当你调用 service.startActivity(intent) 时,你的程序必然会崩。报错如下:
& && && &[code]AndroidRuntimeException :& && && && && &"Calling startActivity() from outside of an Activity context& && && && & requires the FLAG_ACTIVITY_NEW_TASK flag.& && && && & Is this really what you want?"[/code]& && & 这就是上文中提到的。当一个 Activity A 跳转进入另一个 Activity B (它们的启动模式都为默认的 default ), 所以这个 B 会和 A 在一个 Task 之中。但是当你想让 service 跳转到 Activity B, 由于 service 并不是一个 Activity , 所以它没有相关的 task 信息。所以 Service 不会出现在 Activity 的任务栈之中。这种情况下,Activity B 就不知道自己的 Task 在哪里了。
&&为了解决上述问题,我们可以告诉 Activity B 它应该在一个新的 Task 之中:
& && && &[code]// "this" is a serviceIntent it = new Intent(this, ActivityB.class); it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);this.startActivity(it);[/code]& && & 瞅见没?这才是 Activity 的启动模式的正确打开方式。
上一篇:下一篇:酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。本帖标题:本帖地址:
帖子永久地址:&<button type="submit" class="pn" onclick="setCopy('Activity 的正确打开方式\n/thread--1.html', '帖子地址已经复制到剪贴板您可以用快捷键 Ctrl + V 粘贴到 QQ、MSN 里。')">推荐给好友
width:100%">
星期一加班的飘过
width:100%">
你能看穿我旳眸在马路边丢了一分钱 !&&
width:100%">
再撸一遍。。。
width:100%">
年轻的时候,我们常常冲着镜子做鬼脸;年老的时候,镜子算是扯平了.
width:100%">
不要为那些不愿在你身上花费时间的人而浪费你的时间.
width:100%">
发表于 6&天前
生命中的第一个沙发,激动嘞!
width:100%">
发表于 6&天前
路过的帮顶
width:100%">
发表于 昨天&10:45
width:100%">
发表于 4&小时前
纯粹路过,没任何兴趣,仅仅是看在老用户份上回复一下
width:100%">
12345678910
打开手机扫一扫
Comsenz Inc. Design: Dean. DiscuzFans.问题:初学者:请教关于Activity切换的问题
在MainActivity中点击某个按钮启动了GroupActivity,然后按Home键,再从桌面点击应用,在nexus&one模拟器上,能保持在GroupActivity界面,而在我的实体手机上(华为honor6)测试,显示MainActivity。
我需要的是能显示GroupActivity界面,且能保持上面的状态。
min&SDK版本:API&15&&&(Android&4.0.3)
请教,哪里设置错了?解决方案1:
Api&Guides里面的基础知识部分就有介绍。
如果你要显示你的GroupActivity。介意你实现相关的activity的生命周期回调方法。。
处于这几个状态的activiti在系统资源紧缺的情况下会被回收的。
介意认证阅读,,Activity的。Managing&the&Activity&Lifecycle章节
解决方案2:
手机内存低,系统回收了资源!!!
解决方案3:
实体手机上,有可能是app被kill掉了,重新启动的,所以出现的是main&activity
以上介绍了“初学者:请教关于Activity切换的问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:/itwd/670912.html
上一篇: 下一篇:

我要回帖

更多关于 lol新手怎么玩 的文章

 

随机推荐