Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何让Widget PendingIntend重用现有的MainActivity实例?_Android_Android Activity_Android Widget_Android Pendingintent - Fatal编程技术网

Android 如何让Widget PendingIntend重用现有的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还有一些其他选项,例如显示显示邮箱可用空间的消息框/警报 到目前为止一切正常。知道我已经创建了一个小部件,允许直接访问“空闲空间”选项:当用户单击小部件中的按钮时,应该会显示“空闲空间”消息框的主活动 为了解决这个问题,

我正在开发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并将其设置在顶部
这将创建一个从未计划过的活动堆栈。MainActivity应该只有一个实例。如果一个(或多个)ActivityToes位于顶部,则应将其关闭以返回主Activity,然后主Activity将显示信息


我如何建立这种行为?

在您的
意图中添加“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
实例。