所以,我正在尝试创建一个具有类似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。
这将导致其他问题,因为当用户按下主页按钮时,闹钟将不会关闭,并且用户无法打开最近的应用程序来访问警报屏幕(他必须打开应用程序)这样做)。我通过尝试检测主页按钮按下事件来解决此问题。详细答案如下。
答案 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);
这就是关闭你的应用程序,不让任何东西在后台运行。但是,明智地使用它并且不要打开文件,打开数据库句柄等。这些东西通常会通过完成清理( )命令。
我个人讨厌当我在一个应用程序中选择退出时它并没有真正退出。