2014-06-26 175 views
2

我正在嘗試使用Android AlarmManager。問題是,它會彼此接連發生兩次。AlarmManager觸發兩次

public class ScheduleSomething { 

    public static void schedule(Pojo pojo) throws JsonProcessingException { 

     final ObjectMapper mapper = new ObjectMapper(); 
     final String pojoAsJson = mapper.writeValueAsString(pojo); 

     final Intent alarmIntent = new Intent(MyApplication.getAppContext(), 
       PojoAlarmReceiver.class); 
     alarmIntent.putExtra(POJO_AS_JSON, pojoAsJson); 

     final PendingIntent pi = PendingIntent.getBroadcast(MyApplication.getAppContext(), 0, 
       alarmIntent, PendingIntent.FLAG_ONE_SHOT); 

     am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + pojo.getScheduledTime() + 10L, pi); 
    } 
} 

public class AlarmReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     // do stuff. onReceive() is being called twice, every time. 
    } 

} 

Ofcourse我已籤,如果我叫時間表(POJO POJO)方法兩次,但不幸的是,這不是它。現在,我爲此工作但遲早,我想以一種乾淨的方式解決這個問題。 最好的問候,並希望有人知道什麼是錯的。

+2

完全卸載你的應用程序。使用**'adb shell dumpsys alarm' **確認您不再安排任何警報。安裝您的應用程序並運行您的代碼來設置警報。然後再次使用**'adb shell dumpsys alarm' **。如果您在該應用中看到多個條目,那麼您正在安排多個警報。如果沒有,找出你的應用程序還有什麼觸發你的'AlarmReceiver'。 – CommonsWare

+0

有一大堆計劃,但沒有提及我的包名稱的單個Intentrecord,其中大多數是指com.google.android.calendar和com.google.android.gms和其他與Google服務相關的東西。雖然這樣做,我意識到我不註冊一個意向過濾器,爲我自己的包標識符過濾。我想這是根本原因,對吧? –

+0

上述評論附錄:這正是發生了什麼問題。每當有什麼值得截取的東西進來時,BC的觸發器就會進來。我將盡快更新我的代碼。 –

回答

0

好吧,我相信有更多優雅的方法來解決我的問題,但我發現了一個工作溶劑。問題是,在BroadcastReceiver攔截了Alarm之後,我撥打了一個電話,然後又被這個BC攔截了(儘管這個特定的BC不會過濾NEW_OUTGOING_CALL和PHONE_STATE ...)。所以我所做的是增加一個字符串額外並檢查它裏面AlarmReceiver:

public class ScheduleSomething { 

    public static final String SOURCE = "source"; 

    public static void schedule(Pojo pojo) throws JsonProcessingException { 

     final ObjectMapper mapper = new ObjectMapper(); 
     final String pojoAsJson = mapper.writeValueAsString(pojo); 

     final Intent alarmIntent = new Intent(MyApplication.getAppContext(), 
       PojoAlarmReceiver.class); 
     alarmIntent.putExtra(POJO_AS_JSON, pojoAsJson); 
     alarmIntent.putExtra(SOURCE, "com.mypackage.alarm"); 

     final PendingIntent pi = PendingIntent.getBroadcast(MyApplication.getAppContext(), 0, 
       alarmIntent, PendingIntent.FLAG_ONE_SHOT); 

     am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + pojo.getScheduledTime() + 10L, pi); 
    } 
} 

public class AlarmReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     final String source = intent.getStringExtra(RegistrationCallLogic.SOURCE); 

     if ((source == null) || !source.equals("com.mypackage.alarm")) { 
       return; 
     } 
     // do stuff. onReceive() is being called twice, every time. 
    } 

} 
0

一種可能是,你可能已經註冊的廣播接收器的兩倍一個清單文件和其他的服務,如果你使用任何。由於它已註冊兩次,因此您有兩個接收器實例。希望這可以幫助。

1

當我在清單上指定intent-filter後,對於我的報警廣播接收器,我沒有問題。由於alarm.setInexactRepeating(),它在某些錯誤的時間(幾秒鐘)觸發,但不像以前那樣在一秒鐘內兩次。

<receiver 
     android:name=".AlarmReceiver" 
     android:process=":remote" > 
     <intent-filter> 
      <action android:name="com.mine.alarm"/> 
     </intent-filter> 
</receiver> 

還要檢查this