2

我正在使用AlarmManager进行调度。我的闹钟已设置。但是这个警报不会调用BroadcastReceiver来捕捉事件。我已经搜索了很多,但我还没有找到任何解决问题的方法。我张贴我的代码,请看一看,看看我是否缺少一些东西。报警管理器没有激活广播接收器?

AlarmManagerClass:

public class ScheduleMessageManager { 

Context context; 
PendingIntent sender; 
AlarmManager am; 


public ScheduleMessageManager(Context context) { 
    this.context = context; 
} 

public void addAlram(int scheduledMessageID, long scheduledTime) { 

    // Activate Broadcast Receiver to receive broadcasts 
    activateBroadcastReceiver(); 
    //Calendar cal = Calendar.getInstance(); 

    Intent intent = new Intent(context, AlarmReceiver.class); 
    // In reality, you would want to have a unique variable for the request 
    // code 
    intent.putExtra("scheduledMessageID", scheduledMessageID); 
    sender = PendingIntent.getBroadcast(context, scheduledMessageID, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

    // Get the AlarmManager service 
    am = (AlarmManager) context.getSystemService(context.ALARM_SERVICE); 
    am.set(AlarmManager.RTC_WAKEUP, scheduledTime, sender); 

    Log.e("In ScheduleMessageManage", "***** Alarm is set to the mmessage *****"); 
} 

public void cancelPeriodicSchedule(PendingIntent sender) { 
    if (am != null) { 
     if (sender != null) { 
      am.cancel(sender); 
      sender.cancel(); 
     } 
    } 

    // Deactivate Broadcast Receiver to stop receiving broadcasts 
    deactivateBroadcastreceiver(); 
} 

private void activateBroadcastReceiver() { 
    PackageManager pm = context.getPackageManager(); 
    ComponentName componentName = new ComponentName(context, AlarmReceiver.class); 
    pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); 
    Toast.makeText(context, "activated", Toast.LENGTH_LONG).show(); 
} 

private void deactivateBroadcastreceiver() { 
    // TODO Auto-generated method stub 

    PackageManager pm = context.getPackageManager(); 
    ComponentName componentName = new ComponentName(context, AlarmReceiver.class); 
    pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 
    Toast.makeText(context, "cancelled", Toast.LENGTH_LONG).show(); 

} 

}

我AlarmReceiver:

public class AlarmReceiver extends BroadcastReceiver { 

int pendingIntentID; // same as scheduledMessageID 

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

    Log.e("In On Receive", "Alarm has Initiated Broadcast Receiver...."); 

    if (intent.hasExtra("scheduledMessageID")) { 
     pendingIntentID = intent.getExtras().getInt("scheduledMessageID"); 
     Intent sendMessageServiceIntent = new Intent(context, SendMessageService.class); 
     sendMessageServiceIntent.putExtra("pendingIntentID", pendingIntentID); 
     context.startService(sendMessageServiceIntent); 
    } 
} 

}

OnReceieve()是永远调用。

在我的Manifest.xml

<receiver 
     android:name="myPackage.AlarmReceiver" 
     android:enabled="true" > 
    </receiver> 

我无法找出确实的问题出在哪里。请帮我解决它。谢谢。!

+0

你检查的时间,是正确的?你是否在使用GregorianCalendar – 2013-03-07 09:42:23

+0

是的,我认为时间是正确的,因为我也将它显示在我的清单上,显示正确的时间。 – 2013-03-07 09:43:46

+0

听起来很愚蠢,但你有没有检查过scheduleTime是未来? (这是触发报警的绝对时间,而不是报警发生前经过的时间)。对不起,如果你知道这一点,并已检查。 – 2013-03-07 09:45:03

回答

4

http://www.vogella.com/articles/AndroidBroadcastReceiver/article.html中给出了关于使用广播接收器的一个很好的教程。实质上,您的接收器不会声明它将接收的事件。在清单文件中的申报需要的东西,如:

<receiver 
    android:name="myPackage.AlarmReceiver" 
    android:enabled="true" > 
    <intent-filter> 
      <action android:name="your.company.blah.mybroadcast" /> 
     </intent-filter> 
</receiver> 

而且当你创建的意图,它需要

Intent intent = new Intent(); 
intent.setAction("your.company.blah.mybroadcast"); 
// All the other things you want to put in the intent 
+0

@尼尔......这是一个与时间有关的问题。这并没有在一个地方得到更新。 – 2013-03-07 12:31:44

+0

谢谢,很高兴知道。 – 2013-03-07 12:36:58

+0

我面临同样的问题,所以请@UsamaSarwar告诉我什么是解决方案;它与timzone有关吗? – Amt87 2014-02-17 10:57:28

2

我知道,这已经被回答,只是进一步的参考,因为我跑到同一个问题,确保你的接收器标签在标签内,但不是在任何其他标签,如活动(这正是我的问题)。

此外,它帮了不少忙,检查您的报警已经注册成功,就这么跑: 亚行外壳dumpsys报警

-1

你只需要注册您的接收器与报警经理,这将每60 CALL后播出第二:

Intent broadcastIntent = new Intent(YourActivity.this, AlarmReceiver.class); 

     PendingIntent pi = PendingIntent.getBroadcast(this, 0, broadcastIntent, 0); 

     AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 

     long timeInterval = 60 * 1000; 

     am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), timeInterval, pi); 

在清单:

<receiver 
     android:name="myPackage.AlarmReceiver" 
     android:enabled="true" > 
    </receiver>