ant*_*nyt 50 flags android task android-intent android-activity
仅出于测试目的,我允许通过URL下载和安装我的应用APK.下载到手机上后,可以使用Android应用安装程序启动它,用户可以选择将其安装到自己的设备上然后再运行.
考虑我们是否以上述方式下载并运行应用程序.我的应用中的主/启动器活动是登录页面(Activity A
).一旦用户被认证,他们就被带到应用程序的主要区域,例如Activity B
.所以现在这个任务的当前活动堆栈是A > B
.
然后我按下手机上的主页按钮,然后进入Android主屏幕.我通过菜单中的图标重新启动我的应用程序,我被带到了Activity A
,而不是Activity B
.活动堆栈现在是A > B > A
,或者现在有两个单独的任务与活动堆栈A > B
,A
分别.我想要的是Activity B
在我重新启动应用程序时被收回.在这种状态下按回来将带我回去Activity B
.
如果我首先通过安装程序打开应用程序,而不是通过主屏幕/菜单打开应用程序,则只会发生这种不良行为.
我研究了各机制如何开展活动.当我们使用app安装程序时,我们会看到以下日志:
INFO/ActivityManager(XXXX): Starting activity: Intent { dat=file:///mnt/sdcard/download/[my app].apk cmp=com.android.packageinstaller/.InstallAppProgress (has extras) }
INFO/ActivityManager(XXXX): Starting activity: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=[my package]/[Activity A] }
Run Code Online (Sandbox Code Playgroud)
通过发射器/主屏幕:
INFO/ActivityManager(XXXX): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=[my package]/[Activity A] }
Run Code Online (Sandbox Code Playgroud)
当使用安装程序启动时,我们看到它正在使用标志0x10000000
,但是当启动器启动时,我们看到它正在使用0x10200000
.它也使用意图类别.
从文档中我们看到标志是:
public static final int FLAG_ACTIVITY_NEW_TASK
Constant Value: 268435456 (0x10000000)
public static final int FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
Constant Value: 2097152 (0x00200000)
Run Code Online (Sandbox Code Playgroud)
标志FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
(从应用程序从启动器启动时使用)似乎通常会阻止创建新任务(如果已存在),并将恢复上次使用的活动.这是期望的行为.为什么不能在这种情况下工作?有什么我可以做的,以确保我的应用程序将始终返回到最后一个活动,无论它是否通过应用程序安装程序/启动器启动?
如果我使用singleTask
它,Activity A
每次运行应用程序时都会将我带回主活动()(这也是不可取的).
这是一个我发现有人遇到类似问题(没有被接受的答案)的问题:从其他应用程序启动时,应用程序失去了记住其堆栈的能力
编辑:检查标志FLAG_ACTIVITY_BROUGHT_TO_FRONT
在onCreate()
我们的发射活动(再整理,如果它被设置)似乎解决主要症状,但很明显,潜在的问题仍然存在.有更完整的解决方案吗?
EDIT2:从Android电子市场下载/运行应用程序时会出现相同的结果,因此上述某些细节可能不相关.
Ali*_*aka 30
添加了antonyt提供的答案:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
// Activity was brought to front and not created,
// Thus finishing this will get us to the last viewed activity
finish();
return;
}
// Regular activity creation code...
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11358 次 |
最近记录: |