如何让 Widget PendingIntend 重用现有的 MainActivity 实例?

Posted

技术标签:

【中文标题】如何让 Widget PendingIntend 重用现有的 MainActivity 实例?【英文标题】:How to let Widget PendingIntend re-use existing MainActivity instance? 【发布时间】: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 实例。 【参考方案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(),这将不起作用。

【讨论】:

以上是关于如何让 Widget PendingIntend 重用现有的 MainActivity 实例?的主要内容,如果未能解决你的问题,请参考以下文章

QT中让按钮上显示图片,就是让按钮更好看点,有没有简单点可靠的的方法

我在QT主控件mainwindow里我加了一个widget控件,我用QPainter只能在mainwindow里画直线,如何画在widget

如何访问 Flutter 中与其他 Widget 关联的变量? [关闭]

QScrollArea可以帮助我们实现让一个widget的内容带有滚动条(QWidget里内置QScrollArea,QScrollArea里再内置其它QWidget)

Flutter,按下按钮后如何在Text Widget上粘贴数据?

让 Content-Area 和 Widget-Area 并排放置