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



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

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

为了解决这个问题,我只需将以下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已经在运行,一个新的实例被创建在上面。
  • 如果另一个Activity,例如ReadMailActivity,在顶部,一个新的MainActivity被创建并设置在顶部。

这会创建一个从未想过的Activity堆栈。应该只有一个MainActivity实例。如果一个(或多个)activity在顶部,它应该被关闭以返回到MainActivity,然后MainActivity应该显示信息。

我如何建立这个行为?

为您的Intent添加'CLEAR_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实例。

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

最新更新