我有一个欢迎屏幕,可以作为我的应用程序中的第一个活动启动,或者它可以由用户花费时间的主要活动启动。我希望它在从家里开始时的行为略有不同屏幕(或任何其他应用程序)或主要活动。
在onCreate中调用getCallingActivity()
似乎总是返回null,无论调用什么活动。这很奇怪,因为它确实更早地工作,这就是我如何找到字符串返回的格式(无论如何应该在文档中)。我看不出会有什么影响它,因为在调用getCallingActivity()
之前发生的唯一事情就是调用super.onCreate(savedInstanceState)
。我用startActivityForResult(welcomeIntent, RESULT_WELCOME)
调用活动。
我做错了什么?有没有其他方法来获取此信息?
答案 0 :(得分:6)
这是一个已知问题:只有在同一任务中启动了活动时,getCallingActivity()才会返回实际数据(请参阅“任务和后退堆栈”教程)。正确启动结果活动也是如此(它们不能是单实例,也不能使用“FLAG_ACTIVITY_NEW_TASK”)。
答案 1 :(得分:3)
在与Intent
一起使用的startActivityForResult()
中传递额外信息,指明您想要的模式。在新启动的活动的getIntent().getXXXExtra()
中,通过XXX
(onCreate()
取决于您选择的数据类型)读取额外内容。
答案 2 :(得分:3)
每个人似乎都指向同样的解决方案,但没有人用明确的语言表达。 让我这样做。
似乎 getCallingActivity()在不同的Android平台上不一致地返回结果。
问题可能是因为您将活动的 launchMode 设置为 singleInstance 或 singleTask 的。 将其设置为 singleTop 或将其保留为 标准 可以解决您的问题。 当然,更改模式不应影响您的使用案例,因此由您自行决定。
如果它确实影响了您的用例,您可以在意图的附加内容中传递包名称以简化操作。
请注意,在 Lollipop 版本中设置singleInstance或singleTask会返回非null 结果。
答案 3 :(得分:0)
您的通话活动可能比您预期的更早完成。这发生在我身上并导致getCallingActivity返回null,即使调用活动使用的是startActivityForResult
答案 4 :(得分:0)
当在清单中使用singleInstance
作为启动模式声明活动时,我遇到了此问题。就我而言,我找到了一个没有这个声明的解决方案来解决问题。
答案 5 :(得分:0)
getCallingActivity
可以返回null
,具体取决于其他人指出的活动启动模式。我通过调用startActivityForResult
传递getLaunchIntentForPackage()
返回的意图来启动活动。默认情况下,它设置了FLAG_ACTIVITY_NEW_TASK
标记,这导致getCallingActivity
返回null
。致电intent.setFlags(0)
解决了我的问题。