应用程序关闭时取消 AlarmManager
cancel AlarmManager when app is closed
我正在开发一个应用程序来在指定时间对屏幕进行设备锁定和解锁。
为此,我使用 AlarmManager 启动锁定或解锁屏幕的服务。一旦服务执行此操作,它会将 AlarmManager 设置为在 24 小时后重复此操作,因此基本上您正在设置一个每天重复的计划。
问题是,如果用户关闭应用程序,我想取消已设置的所有 alarmmanager。我试图在主要 activity 的 onDestroy 事件中执行此操作。但是当我关闭应用程序时它不会被调用。
我在服务中尝试了此代码来检测应用程序是否 运行ning,如果不是 运行ning 则取消其操作。但这不是一个正确的解决方案,因为用户可能已经完成应用程序并在服务 运行:
之前再次启动它
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningProcInfo = activityManager .getRunningAppProcesses();
for(int i = 0; i < runningProcInfo.size(); i++){
//Toast.makeText(this, runningProcInfo.get(i).processName, Toast.LENGTH_SHORT).show();
if(runningProcInfo.get(i).processName.equals("inusual.example.com.powercontrol2")) {
bAppRunning = true;
}
}
如何实现我想要的行为?
编辑:
这就是我设置 AlarmManager 的方式:
String sTime = (String) aTimeTextViews[i].getText();
String sHour = sTime.substring(0, sTime.indexOf(":"));
String sMinute = sTime.substring(sTime.indexOf(":") + 1, sTime.length());
int iTimeInMinutes = (Integer.parseInt(sHour)*60) + Integer.parseInt(sMinute);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(sHour));
calendar.set(Calendar.MINUTE, Integer.parseInt(sMinute));
calendar.set(Calendar.SECOND, 0);
long timeInMillis = calendar.getTimeInMillis();
if (iTimeInMinutes<=currentTimeInMinutes)
{
timeInMillis += 24*60*60*1000;
}
int iOnOff = aSpinners[i].getSelectedItemPosition();
alarmMgr = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
Intent intent;
if (iOnOff==0)
intent = new Intent(this, Serviceunlock.class);
else
intent = new Intent(this, Servicelock.class);
alarmIntent = PendingIntent.getService(this, 0, intent, 0);
//alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis() ,
// AlarmManager.INTERVAL_DAY, alarmIntent);
alarmMgr.setExact(AlarmManager.RTC_WAKEUP, timeInMillis , alarmIntent);
你可以在 onDestroy() 方法上写 alarmMgr.cancel(pendingIntent);
。
因此,当您的 activity 将要完成或销毁时,您可以覆盖 onDestroy() 方法并停止您的警报管理器
我发现在应用程序关闭时(并且仅在应用程序关闭时)真正被调用的唯一方法是在我的应用程序运行时提供服务 运行,并在 onTaskRemoved 中实现我的代码该服务的事件。
@Override
public void onTaskRemoved(Intent rootIntent){
super.onTaskRemoved(rootIntent);
}
我在这个答案上发现了这个:
How to detect application exit on android?
我正在开发一个应用程序来在指定时间对屏幕进行设备锁定和解锁。 为此,我使用 AlarmManager 启动锁定或解锁屏幕的服务。一旦服务执行此操作,它会将 AlarmManager 设置为在 24 小时后重复此操作,因此基本上您正在设置一个每天重复的计划。
问题是,如果用户关闭应用程序,我想取消已设置的所有 alarmmanager。我试图在主要 activity 的 onDestroy 事件中执行此操作。但是当我关闭应用程序时它不会被调用。
我在服务中尝试了此代码来检测应用程序是否 运行ning,如果不是 运行ning 则取消其操作。但这不是一个正确的解决方案,因为用户可能已经完成应用程序并在服务 运行:
之前再次启动它 ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningProcInfo = activityManager .getRunningAppProcesses();
for(int i = 0; i < runningProcInfo.size(); i++){
//Toast.makeText(this, runningProcInfo.get(i).processName, Toast.LENGTH_SHORT).show();
if(runningProcInfo.get(i).processName.equals("inusual.example.com.powercontrol2")) {
bAppRunning = true;
}
}
如何实现我想要的行为?
编辑: 这就是我设置 AlarmManager 的方式:
String sTime = (String) aTimeTextViews[i].getText();
String sHour = sTime.substring(0, sTime.indexOf(":"));
String sMinute = sTime.substring(sTime.indexOf(":") + 1, sTime.length());
int iTimeInMinutes = (Integer.parseInt(sHour)*60) + Integer.parseInt(sMinute);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(sHour));
calendar.set(Calendar.MINUTE, Integer.parseInt(sMinute));
calendar.set(Calendar.SECOND, 0);
long timeInMillis = calendar.getTimeInMillis();
if (iTimeInMinutes<=currentTimeInMinutes)
{
timeInMillis += 24*60*60*1000;
}
int iOnOff = aSpinners[i].getSelectedItemPosition();
alarmMgr = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
Intent intent;
if (iOnOff==0)
intent = new Intent(this, Serviceunlock.class);
else
intent = new Intent(this, Servicelock.class);
alarmIntent = PendingIntent.getService(this, 0, intent, 0);
//alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis() ,
// AlarmManager.INTERVAL_DAY, alarmIntent);
alarmMgr.setExact(AlarmManager.RTC_WAKEUP, timeInMillis , alarmIntent);
你可以在 onDestroy() 方法上写 alarmMgr.cancel(pendingIntent);
。
因此,当您的 activity 将要完成或销毁时,您可以覆盖 onDestroy() 方法并停止您的警报管理器
我发现在应用程序关闭时(并且仅在应用程序关闭时)真正被调用的唯一方法是在我的应用程序运行时提供服务 运行,并在 onTaskRemoved 中实现我的代码该服务的事件。
@Override
public void onTaskRemoved(Intent rootIntent){
super.onTaskRemoved(rootIntent);
}
我在这个答案上发现了这个: How to detect application exit on android?