【问题标题】:How to let Widget PendingIntend re-use existing MainActivity instance?如何让 Widget PendingIntend 重用现有的 MainActivity 实例?
【发布时间】:2016-01-04 19:41:30
【问题描述】:

我正在开发一个 Android 4+ 应用程序。该应用程序使用一个简单的 MainActivity 可以启动几个其他活动。一个很好的例子是邮件应用程序:MainActivity 显示邮件列表。额外的 ReaderActivity 和 ComposeActivity 可用。让我们假设 MainActivity 有一些其他选项,例如显示一个消息框/警报,显示邮箱的可用空间。

到目前为止一切正常。知道我已经创建了一个允许直接访问“可用空间”选项的小部件:当用户单击小部件中的按钮时,这应该会打开 MainActiviy 显示“可用空间”消息框。

为了解决这个问题,我简单地将以下 PendingIntent 添加到小部件按钮:

// In Windget Provider
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    ...
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget__content);

    Intent showFreeSpaceIntent = new Intent(context, MainActivity.class);
    showFreeSpaceIntent.putExtra(MainActivity.IS_WIDGET_CALL_EXTRA_ID, true);
    PendingIntent showFreeSpacePendingIntent = PendingIntent.getActivity(context, 0, showFreeSpaceIntent , 0);
    views.setOnClickPendingIntent(R.id.widget_infoButton, showFreeSpacePendingIntent );

    appWidgetManager.updateAppWidget(appWidgetId, views);
    ...
}


// In MainActiviy
protected void onCreate(Bundle savedInstanceState) {
    ...
    Intent intent = getIntent();
    Boolean isWidgetCall = (intent != null ? intent.getBooleanExtra(IS_WIDGET_CALL_EXTRA_ID, false) : false);

    if (isWidgetCall) ...
}

这会启动应用程序,其顶部的 MainActivity 会显示所需的信息。

问题:

  • 如果 MainActivity 已经在运行,则会在顶部创建一个新实例。
  • 如果另一个活动,例如ReadMailActivity,在顶部,一个新的 MainActivity 被创建并设置在顶部。

这会创建一个从未计划过的 Activity 堆栈。 MainActivity 应该只有一个实例。如果一个(或多个)Activitoes 位于顶部,则应将其关闭以返回 MainActivity,然后该 MainActivity 应显示信息。

我怎样才能建立这种行为?

【问题讨论】:

  • 你在manifest 中尝试过android:launchMode="singleTop" 吗?
  • @ci_ singleTop 如果现有任务堆栈中的Activity 之上已经有另一个Activity,则将无济于事。 Android 仍会启动另一个 MainActivity 实例。

标签: android android-activity android-widget android-pendingintent


【解决方案1】:

将“CLEAR_TOP”标志添加到您的Intent

Intent showFreeSpaceIntent = new Intent(context, MainActivity.class);
showFreeSpaceIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
showFreeSpaceIntent.putExtra(MainActivity.IS_WIDGET_CALL_EXTRA_ID, true);

这将删除MainActivity 的任何现有实例以及在此之上的任何其他活动,然后创建MainActivity 的新实例。

注意:这仅在您的MainActivity 在任务堆栈中始终处于活动状态(未完成)时才有效。如果您的MainActivity 在启动其他活动时调用finish(),这将不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多