如何让 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)