2016-08-22 32 views
0

我正在做一个应用程序,用于在指定时间内对设备锁定和屏幕解锁进行编程。 为此,我使用AlarmManager启动锁定或解锁屏幕的服务。一旦服务完成,它会设置AlarmManager在24小时后重复此操作,因此基本上您可以设置每天重复的计划。取消应用程序关闭时的AlarmManager

问题是,如果用户关闭应用程序,我想取消设置的每个警报管理器。我试图在主要活动的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); 
+0

你用'onBackPressed()'事件尝试取消报警:

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

我对这个答案发现了这一点? – Riad

+0

如何设置闹钟? –

回答

1

唯一的办法我发现,真正被调用时,应用程序被关闭(并且仅当应用程序关闭时)才会在我的应用程序运行时运行服务,并在该服务的onTaskRemoved事件中实现我的代码。 How to detect application exit on android?

0

你可以写上alarmMgr.cancel(pendingIntent);的onDestroy()方法。

所以,当你的活动将完成或在那个时候再摧毁你可以重写的onDestroy()方法和停止报警经理

+0

问题是当我关闭应用程序时onDestroy()方法没有被调用 – takluiper

+0

你调试了应用程序并检查它吗? –

+0

是的,我已调试,它不会被叫 – takluiper

相关问题