Android 如何让Widget PendingIntend重用现有的MainActivity实例?
我正在开发Android 4+应用程序。该应用程序使用一个简单的MainActivity,可以启动一些其他活动。邮件应用程序就是一个很好的例子:main活动显示邮件列表。另外还提供ReaderActivity和CompositeActivity。让我们假设MainActivity还有一些其他选项,例如显示显示邮箱可用空间的消息框/警报 到目前为止一切正常。知道我已经创建了一个小部件,允许直接访问“空闲空间”选项:当用户单击小部件中的按钮时,应该会显示“空闲空间”消息框的主活动 为了解决这个问题,我只需在小部件按钮中添加以下Android 如何让Widget PendingIntend重用现有的MainActivity实例?,android,android-activity,android-widget,android-pendingintent,Android,Android Activity,Android Widget,Android Pendingintent,我正在开发Android 4+应用程序。该应用程序使用一个简单的MainActivity,可以启动一些其他活动。邮件应用程序就是一个很好的例子:main活动显示邮件列表。另外还提供ReaderActivity和CompositeActivity。让我们假设MainActivity还有一些其他选项,例如显示显示邮箱可用空间的消息框/警报 到目前为止一切正常。知道我已经创建了一个小部件,允许直接访问“空闲空间”选项:当用户单击小部件中的按钮时,应该会显示“空闲空间”消息框的主活动 为了解决这个问题,
pendingent
:
// 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并将其设置在顶部
我如何建立这种行为?在您的
意图中添加“CLEAR\u TOP”标志:
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
的新实例
注意:仅当任务堆栈中的main活动
始终处于活动状态(未完成)时,此操作才有效。如果您的main活动
在启动其他活动时调用finish()
,则此操作将不起作用。将“清除顶部”标志添加到您的意图中
:
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
的新实例
注意:仅当任务堆栈中的main活动
始终处于活动状态(未完成)时,此操作才有效。如果您的MainActivity
在启动其他活动时调用finish()
,这将不起作用。您是否尝试过在现有任务堆栈中的MainActivity
中使用android:launchMode=“singleTop”
启动模式。Android仍将启动另一个MainActivity
实例。您是否在您的中尝试了Android:launchMode=“singleTop”
?@ci\ucode>singleTop
launchMode如果现有任务堆栈中的MainActivity
上已经有另一个Activity
,则该启动模式将不起作用。Android仍将启动另一个MainActivity
实例。