2011-03-25 14 views
6

Ứng dụng của tôi đang đặt báo thức:Buộc dừng ứng dụng - cũng hủy mọi cảnh báo đã thiết lập?

AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
mgr.setRepeating(
    AlarmManager.RTC_WAKEUP, 
    firstRun, 
    interval, 
    makePendingIntent(context)); 

Hoạt động tốt. Nếu tôi đi vào cài đặt hệ thống -> ứng dụng và buộc dừng ứng dụng của tôi, có vẻ như điều này cũng có tác dụng hủy bất kỳ báo thức nào mà tôi đã lên lịch. Điều này có đúng không? Nếu vậy, tôi đang ở trong tình huống kỳ lạ khi cài đặt được biết cuối cùng của tôi là người dùng thực tế đã đặt báo thức, nhưng hệ thống có thể đã bị hủy sau lưng tôi, vì vậy tôi hiện đang hiển thị trạng thái sai cho người dùng cho dù báo thức được đặt hay không.

Cảm ơn

Trả lời

2

Vâng, đó là sự thật. Tất cả những gì bạn có thể làm, theo như tôi biết, là làm cho trạng thái của bạn đúng. Để kiểm tra xem báo thức vẫn còn ở đó bạn phải thực hiện 2 bước:

  1. Atempt để tạo ra của bạn PendingIntent với FLAG_NO_CREATE - chức năng checkPendingIntent sẽ hệt như makePendingIntent trừ lá cờ này trong PendingIntent.getBroadcast và một tấm séc của kết quả - nếu báo thức đã bị hủy theo cách thông thường (theo chính bạn, tất nhiên nếu bạn gọi là cancel() cho số PendingIntent s) hoặc nếu ứng dụng của bạn bị lỗi mà không có Force Stop (tức là ngoại lệ không bắt buộc), PendingIntent.getBroadcast sẽ trả về giá trị rỗng.
  2. Nếu PendingIntent tồn tại, báo thức của bạn có thể được đặt. Để kiểm tra nó, bạn phải đổ thông tin hệ thống về tất cả các báo động và tìm kiếm của bạn ở đó. Để kết xuất thông tin bạn phải gọi

    String collectAlarmsInfo() { 
        StringBuilder result = new StringBuilder(); 
        try { 
         Process process = Runtime.getRuntime().exec("dumpsys alarm"); 
         BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    
         String line; 
         while ((line = bufferedReader.readLine()) != null) { 
          result.append(line); 
          result.append("\n"); 
         } 
        } catch (IOException e) { 
         Log.e(TAG, "Could not retrieve data", e); 
        } 
        return result.toString(); 
    } 
    

    Để sử dụng dumpsys bạn cần có quyền DUMP do người dùng cấp. Khi bạn có bãi chứa, bạn có thể nhận dạng bạn báo thức trong đó theo tên gói của bạn, vì vậy séc sẽ là

    boolean alarmIsSet = collectAlarmsInfo().contains(<your package name>); 
    
Các vấn đề liên quan