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

时间:2015-10-07 14:09:39

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

我正在使用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的App,显示所需的信息。

问题:

  • 如果MainActivity已在运行,则会在顶部创建一个新实例。
  • 如果是其他活动,例如ReadMailActivity位于顶部,新的MainActivity已创建并设置在顶部。

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

如何构建此行为?

1 个答案:

答案 0 :(得分:0)

添加' 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(),则无法使用此功能。