2012-06-06 185 views
0

我有下面的代碼來調用廣播接收器:廣播接收器不叫

public class WorkItemAlarmManager { 
    ... 
     public void initAlarm(HelpMe helpMe, String delay,String period,WorkItem workItem){ 
      //HelpMe = Activity 
helpMe.registerReceiver(new WorkItemAlarmHandler() , new IntentFilter("WORK_ITEM_ALARM")); 

      Intent intent = new Intent("WORK_ITEM_ALARM"); 
      intent.setClass(helpMe, WorkItemAlarmManager.class); 
      intent.putExtra("work_item", workItem); 
      PendingIntent mAlarmSender = PendingIntent.getService(helpMe, 0,intent, 0); 

      Calendar calendar = Calendar.getInstance(); 
      calendar.setTimeInMillis(System.currentTimeMillis()); 
      //System.out.println("START"+System.currentTimeMillis()); 
      calendar.add(Calendar.SECOND, calcDelayMillis(delay)); 
      //System.out.println("END"+calendar.getTimeInMillis()); 
      AlarmManager am = (AlarmManager) helpMe.getSystemService(Context.ALARM_SERVICE); 
      am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), mAlarmSender); 
     } 
    ... 
    } 

和廣播接收器:

public class WorkItemAlarmHandler extends BroadcastReceiver{ 

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

} 

但WorkItemAlarmHandler永遠不會被調用。

更新: 我試着首先在清單中註冊BroadcastReceiver。但是這並不奏效:

<receiver 
      android:name="de.helpme.alarm.WorkItemAlarmHandler" 
      android:enabled="true" 
      android:label="WorkItemAlarmHandler" > 
      <intent-filter> 
       <action android:name="WORK_ITEM_ALARM" /> 
      </intent-filter> 
     </receiver> 

感謝您的回答:)。現在它可以工作 - 但我還不知道哪一個是正確的,因爲我一次執行了兩個答案。如果一個數字是正確的,我將右側標記爲答案。

更新: 因爲我看到這個問題的原因是:

PendingIntent mAlarmSender = PendingIntent.getService(helpMe, 0,intent, 0); 

有了這個代碼,它工作正常:

PendingIntent mAlarmSender = PendingIntent.getBroadcast(helpMe, 0, intent, 0); 

你的幫助再次感謝!

+0

您是否在manifest.xml中註冊過該代碼。 –

回答

1

試試這個:

在WorkItemAlarmManager;

public class WorkItemAlarmManager { 
    ... 
     public void initAlarm(HelpMe helpMe, String delay,String period,WorkItem workItem){ 
      Intent intent =new Intent(helpMe, WorkItemAlarmHandler.class); 
      intent.setAction("WORK_ITEM_ALARM"); 
      intent.putExtra("work_item", workItem); 
      PendingIntent mAlarmSender= 
      PendingIntent.getBroadcast(helpMe, 0, intent, 0); 
      Calendar calendar = Calendar.getInstance(); 
      calendar.setTimeInMillis(System.currentTimeMillis()); 
      //System.out.println("START"+System.currentTimeMillis()); 
      calendar.add(Calendar.SECOND, calcDelayMillis(delay)); 
      //System.out.println("END"+calendar.getTimeInMillis()); 
      AlarmManager am = (AlarmManager) helpMe.getSystemService(Context.ALARM_SERVICE); 
      am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), mAlarmSender); 
     } 
    ... 
    } 

和WorkItemAlarmHandler:

public class WorkItemAlarmHandler extends BroadcastReceiver{ 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(intent.getAction().equals("WORK_ITEM_ALARM")){ 
      Toast.makeText(context, "WORK_ITEM_ALARM", Toast.LENGTH_LONG).show(); 
      }else{ 
      Toast.makeText(context, "repeating alarm", 
      Toast.LENGTH_LONG).show(); 
      } 
    } 

} 
1

代碼使用:

intent.setClass(helpMe, WorkItemAlarmManager.class); 

但您指定要最終處理這個意圖的類setClass(...)方法。

因此應該寫:

intent.setClass(helpMe, WorkItemAlarmHandler.class); 

據我記得,如果手動指定類或組分(如:與setClass()方法)該對象具有在清單中指定,所以請確保接收器在那裏提到。

+0

據我所知,如果不涉及廣播,您可以在沒有設置課程的情況下完美地完成任務。 – Schoentoon