2013-04-08 23 views
6

Tôi đang xây dựng một ứng dụng đặt phòng taxi, tôi cần vị trí hiện tại của cab mỗi 20 giây.onReceiver của BroadcastReceiver không được gọi là, AlarmManager

Tôi đã xác định một AlarmManager và cần nó để tự lặp lại sau mỗi 20 giây. Nhưng nó không lặp lại thường xuyên. Thay vào đó nó lặp lại chính nó sau 233 giây, và chỉ một lần. Tôi làm gì sai ở đây ?

màn hình của tôi có một lớp OnAlarmReceiver bên trong, trong onCreate của màn hình chính của tôi tôi kêu gọi AlarmManager

AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    Intent i = new Intent(this, OnAlarmReceiver.class); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, PendingIntent.FLAG_CANCEL_CURRENT); 
    Calendar cal = Calendar.getInstance(); 
    cal.add(Calendar.SECOND, 20); 
    mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
      cal.getTimeInMillis(), God.UPDATE_PENDING_INTERVAL, pi); 

lớp Inner trong màn hình chính

public class OnAlarmReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // PullPendingRequests.acquireStaticLock(context); 
     Toast.makeText(context, "Don't panik but your time is up!!!!.", Toast.LENGTH_LONG) 
       .show(); 
     Log.d("Taxeeta:PullPendingRequets", "CallService Location"); 
     context.startService(new Intent(context, PullPendingRequests.class)); 
    } 
} 

tập tin AndroidManifest tôi có

<service 
     android:name="com.taxeeta.support.PullPendingRequests" 
     android:enabled="true" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait" 
     android:theme="@android:style/Theme.Light.NoTitleBar" /> 

    <receiver android:name=".com.taxeeta.HomeScreen.OnAlarmReceiver" /> 
</application> 

Đầu ra của adb shell dumpsys alarm

com.taxeeta 
    51471ms running, 5248 wakeups 
    5248 alarms: flg=0x4 cmp=com.taxeeta/.HomeScreen$OnAlarmReceiver 

Sản lượng adb shell dumpsys alarm | grep taxeeta

ELAPSED_WAKEUP #7: Alarm{409303b0 type 2 com.taxeeta} 
    operation=PendingIntent{408ba2d8: PendingIntentRecord{40887be8 com.taxeeta broadcastIntent}} 
com.taxeeta 
    5248 alarms: flg=0x4 cmp=com.taxeeta/.HomeScreen$OnAlarmReceiver 

Trả lời

10

Để khắc phục, tôi đã xóa lớp bên trong OnAlarmReceiver và sửa tệp androidmanifest.xml.

<receiver 
     android:name="com.taxeeta.support.OnAlarmReceiver" 
     android:exported="true" > 
     <intent-filter> 
      <action android:name="android.intent.action.NOTIFY" /> 
     </intent-filter> 
    </receiver> 
0

Đoạn mã này làm việc cho tôi và chắc chắn rằng bạn đã thêm reciever trong file manifest android.

AlarmManager service = (AlarmManager) context 
      .getSystemService(Context.ALARM_SERVICE); 
Intent i = new Intent(context, OnAlarmReceiver.class); 
PendingIntent pending = PendingIntent.getBroadcast(context, 0, i, 
         PendingIntent.FLAG_CANCEL_CURRENT); 
Calendar cal = Calendar.getInstance(); 
// Start 20 seconds after boot completed 
cal.add(Calendar.SECOND, 20); 
// 
// Fetch every 20 seconds 
// InexactRepeating allows Android to optimize the energy consumption 
service.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
         cal.getTimeInMillis(), 1000*20, pending); 
+1

Không, không hoạt động. OnAlarmReceiver, onReceive cũng không được gọi. – Siddharth

+0

Tương tự ở đây không có gì trên máy báo động hoạt động cho tôi. Tôi đã thử tất cả các gợi ý cho việc này. Không chắc chắn phải làm gì – JPM

0

Nếu câu trả lời ở trên không làm việc cho bạn thì có một cách khác để không nhận được bất kỳ callbacks khi AlarmManager cháy báo động đã hết hạn. Bạn chỉ cần kiểm tra điều này: bằng cách gửi sai Intent khi khởi tạo PendingIntent. Ví dụ: bạn muốn nhận cuộc gọi onReceive trên một trong các máy nhận của mình nhưng bạn đã khởi tạo PendingIntent qua getActivity hoặc getService, nhưng ý bạn thực sự là getReceiver.

Khi tạo thể hiện của PendingIntent, có rất nhiều cách để tạo ra nó (getService, getActivity, getReceiver, getForegroundService:

nếu bạn muốn Activity người nhận mục đích sau đó bạn:

PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_*); 

nếu bạn muốn BroadcastReceiver người nhận mục đích:

PendingIntent.getReceiver(this, 0, intent, PendingIntent.FLAG_*); 

nếu bạn muốn có một foreground Service người nhận mục đích:

PendingIntent.getForegroundService(this, 0, intent, PendingIntent.FLAG_*); 

nếu bạn muốn có một Service người nhận mục đích:

PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_*); 

Ngoài ra, hãy chắc chắn rằng bạn intents đang trỏ đến lớp đúng . (ví dụ: tạo ý định cho Hoạt động, Dịch vụ, v.v.). Bạn sẽ không nhận bất kỳ cuộc gọi nếu bạn vượt qua sai lầm như thế này:

Intent intent = new Intent(this, MyReceiver.class); // You wanted receiver 

// PendingIntent was created in such a way 
// you wanted this to be received by an activity. 
// you will not receive any call if you set it up like this. 
PendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_*); 

Tôi cũng đăng câu trả lời tương tự here.

HTH

Các vấn đề liên quan