我正在使用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,显示所需的信息。
问题:
这会创建一个从未打算过的Activity堆栈。应该只有一个MainActivity实例。如果一个(更多)Activitoes位于顶部,则应关闭以返回MainActivity,然后MainActivity将显示该信息。
如何构建此行为?
答案 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()
,则无法使用此功能。