完成后应用程序不会关闭()

时间:2014-09-04 18:23:02

标签: java android broadcastreceiver alarmmanager

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

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

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

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

Sagar Pilkhwal也有另外一种解决此问题的方法,如果您不希望在最近的应用程序中显示警报屏幕,则会启动另一项活动。

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

android:excludeFromRecents="true"

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

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

4 个答案:

答案 0 :(得分: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活动的特定生命周期,您无法确定应用程序是否已关闭/被杀死。

答案 1 :(得分:1)

好吧,我认为。

System.exit(0);

可能?我是新手你...但我有时会用它..

答案 2 :(得分:1)

在警报活动中将以下内容放入Manifest:

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);}

答案 3 :(得分:0)

System.exit(0);

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

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