2016-08-22 52 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