【问题标题】:Exiting my app programmatically以编程方式退出我的应用程序
【发布时间】:2014-05-14 03:23:17
【问题描述】:

如何从我的应用程序中以编程方式退出我的应用程序?我有一个退出按钮,它会弹出一个对话框,提示用户确认退出。后退按钮做同样的事情。这通常有效。但是,当我收到某些事件并且用户点击通知时,我也会向我的 MainActivity 发起意图。我注意到,在这种情况下,当意图启动,然后用户尝试退出时,应用程序并没有退出,而是似乎回到了前一个实例。如果我点击 3 个通知将 3 个 Intent 返回到 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());

【问题讨论】:

    标签: android android-intent exit android-notifications


    【解决方案1】:

    前两个考虑:

    • 不要在您的应用程序中使用退出按钮,更重要的是不要在用户按下返回时出现对话框询问他是否要退出。当用户使用返回键退出时,android 系统会小心关闭您的应用。
    • 您无需调用System.exit(0) 来终止Activity,只需Activity.finish()

    为避免Intent 调用同一Activity 的多个实例,请从Intent 中删除FLAG_ACTIVITY_NEW_TASK 标志并添加FLAG_ACTIVITY_CLEAR_TOP 一个。

    来自文档:

    FLAG_ACTIVITY_CLEAR_TOP
    如果设置,并且正在启动的活动是 已经在当前任务中运行,而不是启动一个新的 该活动的实例,其之上的所有其他活动 将被关闭,这个 Intent 将被传递到(现在在顶部) 旧 Activity 作为新 Intent。

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

    【讨论】:

    • 我了解 Android 指南不赞成退出按钮,但这是我的情况的要求,因为我的应用程序需要登录,并且为了安全起见,我需要确保应用程序已正确注销并在用户选择退出时退出。我正在终止整个应用程序,而不仅仅是 Activity,这就是我调用 System.exit(0); 的原因。阅读文档后,我从 FLAG_ACTIVITY_NEW_TASK 更改为 FLAG_ACTIVITY_CLEAR_TOP,这适用于我的一台设备,但在另一台设备(带有 4.3 的三星 S3)上,我仍然得到相同的行为。知道为什么吗?
    • 这很奇怪,也许用这个主题打开另一个问题。对我来说 FLAG_ACTIVITY_CLEAR_TOP 是正确的方法,我不知道为什么 S3 不起作用。
    • OK 就可以了。谢谢。有什么方法可以查看我的应用程序的活动回栈,以确保一切正常运行?
    • stackoverflow.com/a/6242122/1080191 这不是您要问的,但也许可以提供帮助。
    【解决方案2】:

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

    【讨论】:

    • 谢谢。我删除了 setFlags 行,现在意图标志为 0。但是,我仍然面临同样的问题。
    • 我不确定您是否应该调用 System.exit(0)。
    【解决方案3】:

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

    在 Manifest.xml 中

    " ... android:launchMode="singleInstance">

    【讨论】:

    • 嗨,刚刚试过这个,是的,它可以工作......有点。退出应用程序按预期工作。但是,现在当我从通知中启动意图时,活动不会获得通知中的额外内容或操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 2023-03-29
    • 2011-09-13
    • 2017-12-19
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多