Android:从"最近的应用程序"启动应用程序启动它与意图中使用的最后一组附加功能

r3m*_*3mo 13 android extras android-intent android-activity

这里有点困惑的问题:

我有一个主屏幕小部件,当点击它时,启动我的主应用程序Activity,并在意图中添加一些额外内容:

Intent start = new Intent(context, Main.class);
start.putExtra("action", "showXYZ");
start.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(start);
Run Code Online (Sandbox Code Playgroud)

这一切都很好,它开始我的活动,我的活动按预期收到额外的.它处理这些额外内容并开始另一项活动.

一旦用户点击主屏幕小部件并以这种方式启动主要活动,通过"最近的应用程序"方法进入应用程序(按住"主页"键)将启动主要活动及其他内容 - 导致处理发生我不想要(并导致第二个活动打开,而不是仅显示主活动).

这有什么解决方法吗?从"最近的应用程序"方法启动应用程序时,我想简单地启动Main活动而不使用最后一组附加功能.

非常感谢您的帮助!r3mo

注意:我在Android 1.5上

编辑:

在这里找到了一个解决方法: Android保持缓存我的意图额外,如何声明一个保留新鲜额外的待处理意图?

我将为窗口小部件引发的意图添加时间戳,并检查Main.java中的时间戳是否是最近的.如果是,我将继续处理.如果没有,我将只显示Main.java活动.

很想知道是否有任何官方解决方案.

Mr *_*uni 41

正如Martijn所说,您可以使用带有标志FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY集的Intent来检查您的应用程序是否已打开,如下所示:

int flags = getActivity().getIntent().getFlags();       
if ((flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) {
    // The activity was launched from history
}
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这个标志应该是不可靠的. (3认同)

小智 11

我认为你可以通过检查Intent标志来区分"正常"启动和"最近应用程序"启动; 有一面叫做旗帜

Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

根据文件:

This flag is not normally set by application code, but set for you by the system if this activity is being launched from history (longpress home key).

因此,当设置此标志时,您可以选择忽略其他内容.


小智 0

使用后,您应该从您的意图中清除额外的内容。

Bundle extras = getIntent().getExtras();
if (extras == null) {
    return;
}
String value1 = extras.getString("Value1");
String value2 = extras.getString("Value2");
extras.clear();
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的建议。我刚刚在 Main.java (由小部件启动)中尝试过这个,这似乎没有任何区别。这不只是清除局部变量“extras”吗?我认为问题在于 Android 如何启动“最近的应用程序”活动并将最后一组附加内容传递给它。 (3认同)