【问题标题】:App won't close after finish()完成后应用程序不会关闭()
【发布时间】:2014-09-04 18:23:02
【问题描述】:

因此,我正在尝试创建一个应用程序,该应用程序具有类似 Android 手机闹钟的功能,它会在用户选择的时间提醒他们。当警报屏幕出现时,用户可以选择推送通知或暂停,应用将推送通知然后关闭。

但是,当我单击贪睡或通知按钮时,应用程序并没有关闭。相反,应用程序会停止警报声并最小化(就像用户触摸主页按钮时一样)。如果我触摸最近的应用程序,我可以再次打开警报屏幕。

编辑:我知道有一些代码,例如 System.exit() 或 killProcess,因为不推荐使用这些代码,我宁愿避免使用它们。 我问的原因是因为我测试了手机随附的真实时钟应用程序(4.3),并且它的警报屏幕将在我按下贪睡或关闭按钮后关闭。所以一定有办法让我做同样的事情,对吧?

回答 好的,正如Sagar Pilkhwal 下面解释的那样,在阅读了其他相关问题之后,我发现没有“好的”方法可以通过代码关闭您的应用程序,您必须将该选项留给用户或操作系统。除非您想使用 System.exit 或 killProcess,但它们是强制关闭应用程序的坏方法。

Sagar Pilkhwal 也有解决此问题的替代方法,如果您不希望您的警报屏幕显示在最近的应用程序中,您可以调出另一个活动。

但是,对于这种情况和一般的警报管理器,打开 MainActivity 会导致讨厌的东西,因为 MainActivity 是我们处理警报事件的时候。然后我找到了另一个解决方案,如果您不希望您的警报屏幕显示在最近的应用程序中,只需添加

android:excludeFromRecents="true"

添加到 Manifest 中的 Alert.class Activity,或将 Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 添加到用于启动 Alert.class 的 Intent。

这会导致其他问题,当用户按下 Home 键时,闹钟不会关闭,并且用户无法打开最近的应用程序以访问警报屏幕(他必须打开应用程序这样做)。我通过尝试检测主页按钮按下事件来解决此问题。详细答案如下。

【问题讨论】:

  • 考虑创建一个minimal, complete, and verifiable example。这是很多代码,并非所有代码都是重现您的问题所必需的。包括您编程的语言以及您正在编程的设备会很有帮助。
  • 谢谢,我编辑并删除了其中的一些代码。其余的,我真的不知道它是否与问题有关(如果我知道我就不会问这个问题),所以为了安全起见,我仍然保留它。

标签: java android broadcastreceiver alarmmanager


【解决方案1】:

Android 的设计不支持选择退出应用程序,而是由操作系统管理它。你可以通过对应的 Intent 调出 Home 应用:

public void quit() {
    Intent startMain = new Intent(Intent.ACTION_MAIN);
    startMain.addCategory(Intent.CATEGORY_HOME);
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startMain.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(startMain);
}

不推荐关闭应用程序的方法只是调用:

android.os.Process.killProcess(android.os.Process.myPid());

System.exit(0);

否则,由于 Android 活动的特定生命周期,您无法确定应用程序是否已关闭/终止。

【讨论】:

  • 那么,从技术上讲,我的代码没有问题吗?完成后应用程序不会关闭的原因不是因为我不小心在其中输入了一些错误的代码,而是因为Android这样处理应用程序?
  • 是的,你可以这么说,如果你想真正退出你的应用程序,试试this.finish();,然后试试android.os.Process.killProcess(android.os.Process.myPid());System.exit(0);
  • @Sagar 我正面临这个问题,你能帮帮我吗。
【解决方案2】:

我想好了。

System.exit(0);

也许?我是安卓新手..但我有时会使用它..

【讨论】:

  • 永远不要使用System.exit(0)。这违背了 Android 编码实践。它旨在立即退出应用程序,这不是您想要的。如果您有理由提前离开应用程序,另一种方法是使用 finish() 方法。当System.exit(0) 执行时会发生什么? Ans: VM 停止进一步执行,程序将退出。
  • 哦,好吧..所以这意味着残酷的力量完成对吧?所以服务和接收器也会被杀死??正确的?? @SagarPilkhwal
  • 查看post,它表示使用System.exit(0);AdMob 存在问题。
【解决方案3】:

在您的警报活动中将以下内容放入清单中:

android:excludeFromRecents="true" //this will make the Activity be exclude from recents list.

您还可以添加android:launchMode="singleInstance"android:taskAffinity=""(如果您知道他们的工作)

在 Alert 类中,使用它来检测主页按钮按下事件:

@Override
public void onPause() {
    if (!isFinishing()) {
        createNotf(); //Handle home button press here.
    }
    super.onPause();
}

使用它来处理按下的返回按钮:(如果你想使用 isFinishing() 检测主页按钮按下,你必须有这个代码;

@Override
public void onBackPressed() {
    //Handle BackButton event here.
}

仅就我而言,当用户按下主页按钮时,我将创建一个通知,因此他可以单击通知或再次打开应用程序以访问警报屏幕。:

private void createNotf() {
    Intent screenIntent = new Intent(MyAlert.this, MyAlert.class);
    screenIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    screenIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
    PendingIntent pIntent = PendingIntent.getActivity(MyAlert.this, MainActivity.SEND_ALARM_CODE, screenIntent, PendingIntent.FLAG_CANCEL_CURRENT);
    Notification.Builder ntfBuilder = new Notification.Builder(this)
    .setAutoCancel(true)
    .setContentTitle("ALARM_RUNNING")
    .setLargeIcon(bitmap)
    .setSmallIcon(R.drawable.ic_launcher)
    .setContentText("CLICK_TO_OPEN_ALERTSCREEN.")
    .setContentIntent(pIntent);

    NotificationManager myNotfM = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);     
    myNotfM.notify(999, ntfBuilder.build());        
}

当警报停止时,该通知也将一目了然:

@Override
public void onDestroy() {
    super.onDestroy();
    NotificationManager mntfM = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    mntfM.cancel(999);}

【讨论】:

    【解决方案4】:
    System.exit(0);
    

    那里会关闭你的应用程序,不让后台运行任何东西。但是,明智地使用它,不要让文件打开,数据库句柄打开等。这些东西通常会通过finish()命令清理.

    我个人讨厌在应用程序中选择退出但它并没有真正退出。

    【讨论】:

      猜你喜欢
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 2012-06-30
      • 2011-12-27
      相关资源
      最近更新 更多