应用关闭后取消AlarmManager

时间:2016-08-22 07:36:56

标签: android alarmmanager ondestroy

我正在做一个应用程序来设置设备锁定并在指定时间解锁屏幕。 为此,我使用AlarmManager启动锁定或解锁屏幕的服务。一旦服务完成,它会将AlarmManager设置为在24小时后重复此操作,因此基本上您设置的是每天重复的计划。

问题是,如果用户关闭应用程序,我想取消已设置的每个警报管理器。我试图在主要活动的onDestroy事件中执行此操作。但是当我关闭应用程序时,它并没有被调用。

我在服务中尝试使用此代码来检测应用是否正在运行,如果它未运行则取消其操作。但这不是一个正确的解决方案,因为用户可以在服务运行之前完成应用并再次启动它:

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

2 个答案:

答案 0 :(得分:1)

我发现在应用程序关闭时(并且仅在应用程序关闭时)才真正被调用的唯一方法是在我的应用程序运行时运行服务,并在该服务的onTaskRemoved事件中实现我的代码。 / p>

@Override
public void onTaskRemoved(Intent rootIntent){
    super.onTaskRemoved(rootIntent);
}

我在这个答案中发现了这个: How to detect application exit on android?

答案 1 :(得分:0)

您可以在onDestroy()方法上写alarmMgr.cancel(pendingIntent);

因此,当您的活动即将完成或销毁时,您可以覆盖onDestroy()方法并停止您的警报管理器