Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.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 以编程方式退出我的应用程序_Android_Android Intent_Exit_Android Notifications - Fatal编程技术网

Android 以编程方式退出我的应用程序

Android 以编程方式退出我的应用程序,android,android-intent,exit,android-notifications,Android,Android Intent,Exit,Android Notifications,如何从应用程序中以编程方式退出应用程序?我有一个退出按钮,弹出一个对话框,提示用户确认退出。后退按钮做同样的事情。这通常有效。然而,当我收到某些事件,用户点击通知时,我也会将意图发回MainActivity。我注意到,在这种情况下,当intent启动,然后用户尝试退出时,应用程序不会退出,而是返回到上一个实例。如果我点击3个通知,启动3个返回MainActivity的意图,我意识到我需要退出应用程序3次,然后再返回主屏幕 以下是我的退出代码: private AlertDialog alert;

如何从应用程序中以编程方式退出应用程序?我有一个退出按钮,弹出一个对话框,提示用户确认退出。后退按钮做同样的事情。这通常有效。然而,当我收到某些事件,用户点击通知时,我也会将意图发回MainActivity。我注意到,在这种情况下,当intent启动,然后用户尝试退出时,应用程序不会退出,而是返回到上一个实例。如果我点击3个通知,启动3个返回MainActivity的意图,我意识到我需要退出应用程序3次,然后再返回主屏幕

以下是我的退出代码:

private AlertDialog alert;
if (alert != null) {
  if (alert.isShowing()) {
   alert.dismiss();
  }
}
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Exit");
builder.setMessage("Are you sure you want to exit?").setCancelable(false);
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
  public void onClick(DialogInterface dialog, int id) {
    getActivity().finish();
    System.exit(0);
  }
}).setNegativeButton("No", new DialogInterface.OnClickListener() {
  public void onClick(DialogInterface dialog, int id) {
    dialog.cancel();
  }
});
alert = builder.create();
alert.show(); 
这是我的通知/意图代码

Intent launchIntent;
launchIntent = new Intent(context, MainActivity.class);
launchIntent.putExtra("myType", type);
launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, launchIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder noti = new NotificationCompat.Builder(
  context).setContentTitle(context.getResources().getString(R.string.app_name))
  .setContentText(notificationMessage)
  .setSmallIcon(R.drawable.ic_stat_notify)
  .setContentIntent(pendingIntent)
  .setAutoCancel(true)
  .setWhen(System.currentTimeMillis())
  .setDefaults(Notification.DEFAULT_ALL);
notificationManager.notify(notifyId, noti.build());

您正在使用FLAG_Activity_new_任务启动活动的新实例。你不应该这样做。您应该使用旧的活动,否则将继续创建新实例。Happeping是指您正在创建的每个任务都被添加到ActivityStack中,当您回击时,它将遍历此列表。如果您创建了三个实例,那么每次回击时,它都会显示您的活动3次。

您可以将您的活动设置为单个实例,以便从您调用设备的任何位置返回堆栈中的相同活动

在Manifest.xml中


“…android:launchMode=“singleInstance”>

前两个注意事项:

  • 不要在应用程序中使用退出按钮,更重要的是,不要在用户按下后退键时用对话框询问他是否要退出。当用户按后退键退出时,android系统会注意关闭您的应用程序
  • 您不需要调用
    System.exit(0)
    来终止
    活动
    ,只需调用
    Activity.finish()
要避免调用同一
活动的多个实例的
Intent
,请从
Intent
中删除
FLAG\u Activity\u NEW\u TASK
标志,并添加
FLAG\u Activity\u CLEAR\u TOP
一个

从文件:

标记\活动\清除\顶部
如果已设置,则正在启动的活动为 已在当前任务中运行,而不是启动新任务 该活动的实例,以及它上面的所有其他活动 将关闭,并将此意图交付给(现在位于顶部) 旧的活动作为新的意图

标记活动新任务
如果设置,此活动将成为此历史堆栈上新任务的开始


谢谢。我已经删除了setFlags行,现在意图标志是0。但是,我仍然面临同样的问题。我不确定您是否应该调用System.exit(0).嗨,刚刚尝试了这个,是的,它是有效的…sorta。退出应用程序按预期工作。但是,现在当我从通知中启动意图时,活动没有得到通知中的额外内容或操作。我理解Android指南不赞成退出按钮,但这是我的情况下的一个要求,因为我的应用程序需要一个login,为了安全起见,我需要确保应用程序在用户选择退出时正确注销和退出。我正在终止整个应用程序,而不仅仅是活动,这就是我调用System.exit(0)的原因阅读完文档后,我将FLAG_ACTIVITY_NEW_TASK更改为FLAG_ACTIVITY_CLEAR_TOP,这在我的一台设备上有效,但在另一台设备上有效(三星S3和4.3),我仍然有同样的行为。知道为什么吗?这很奇怪,可能会有另一个关于这个主题的问题。对我来说,FLAG_ACTIVITY_CLEAR_TOP是正确的方法,我不知道为什么S3不起作用。好的会起作用。谢谢。有没有办法查看我的应用程序的活动后堆栈,以确保事情按应有的方式工作?这不完全正确你所要求的,但可能会有所帮助。