为已被 Home 按钮暂停的应用程序的 Intent 添加额外内容

Posted

技术标签:

【中文标题】为已被 Home 按钮暂停的应用程序的 Intent 添加额外内容【英文标题】:Add extras to Intent of application which has been paused by Home button 【发布时间】:2014-02-20 21:51:41 【问题描述】:

我有一个能够启动该应用程序的主应用程序和主屏幕小部件。 Widget 在 Intent 中添加了一些附加功能,以便将初始数据传递给应用程序。

Bundle extras = new Bundle();
extras.putString(AppWidgetConfigureActivity.EXTRA_ITEM, modeName);              

Intent modeIntent = context.getPackageManager().getLaunchIntentForPackage("com.my.app");

modeIntent.putExtras(extras);
modeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                 
context.startActivity(modeIntent);

在该应用程序的 OnCreate 方法中,我得到了这个附加功能:

@Override
public void onCreate(Bundle savedInstanceState)

super.onCreate(savedInstanceState);
Intent intent = this.getIntent();
String mode = intent.getStringExtra(EXTRA_ITEM);
...

如果应用程序没有通过按返回按钮启动或停止,一切都会很好。 但是,如果应用程序已被 Home 按钮暂停,它会从我的小部件中重新启动,并带有旧的附加功能,它从 onResume 方法开始,而不是从 onCreate(这是显而易见的事实)开始,此时活动的意图有旧的附加功能,但不是我的附加功能从小部件放入 Intent。

如何将附加组件从小部件传递到已被 Home 按钮暂停的应用程序?

【问题讨论】:

如果你想在onCreate中传递另一个时间,你必须销毁活动。 onResume 不允许意图捕获,因为它是恢复刚刚创建并刚刚使用意图的内容的回调。如果您想重新加载活动,可以尝试在返回时使用“this.finish” 不,我不想破坏活动或以某种方式干扰应用程序的标准工作流程。我想留在常见的 android 工作流程和界面中。 【参考方案1】:

我不太确定你想要什么,但让我试试.. 您可以使用getIntent()onResume() 中获取Intent,但我不确定您是否仍然可以在那里获取额外内容。 但是,如果您必须重新创建某些内容,您可以只保存在 onCreate() 方法中获得的额外内容,并将应用程序的内容设置为 onResume()。 也可以看看onSaveInstanceState()onRestoreInstanceState()

String mode;

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    Intent intent = this.getIntent();
    mode = intent.getStringExtra(EXTRA_ITEM);
    ...


@Override
public void onResume() 
    setMode(mode);

【讨论】:

让我更直接地解释我的目标:第一次小部件运行带有一些附加功能的应用程序。应用程序启动并调用 onCreate 方法。在这一点上,我从 Intent 中得到了我期望的确切额外内容。然后我按下主页按钮,应用程序暂停(但没有被破坏)。接下来,我使用小部件重新启动该应用程序,并添加一些新的附加功能。应用程序运行和 onResume 方法被调用。在这一点上,我尝试从 Intent 获取新的附加功能,但我得到了我第一次从小部件中放入 Intent 的旧附加功能。 这是正确的,您最初创建的应用程序活动不会被破坏。不是通过主页按钮,设备睡眠或重新开始活动。 试图更准确地说:这是正确的,您最初创建的应用程序活动不会被破坏。 (不是通过主页按钮、设备睡眠或再次启动活动)...如果您使用 startActivity() 从您的小部件再次启动它,您将获得此活动的第二个实例,而第一个不会被销毁并且仍然会在堆栈上......所以你也许应该在重新开始之前杀死旧的 - 也许使用像clean_topreorder_to_frot这样的标志或其他方式【参考方案2】:

我找到了解决办法! 您只需向 Intent 添加一个标志。

modeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

此标志 (FLAG_ACTIVITY_CLEAR_TOP) 清除当前任务堆栈并在 onResume 回调中显示新 Intent 的附加内容。

【讨论】:

我也面临同样的问题,但在我的情况下,应用程序通过主页按钮暂停,我再次从小部件配置活动调用应用程序,但上述解决方案对我不起作用

以上是关于为已被 Home 按钮暂停的应用程序的 Intent 添加额外内容的主要内容,如果未能解决你的问题,请参考以下文章

Android中是不是存在暂停状态?

如何维护Android Activity

是否可以在打字稿中将某些内容标记为已弃用?

此帐户已被暂停。有关更多信息,请联系您的托管服务提供商 [关闭]

检测 Siri Remote 上的音量和 Home 键按下情况

未定义的名称“更改按钮”。尝试将名称更正为已定义的名称,或定义名称