【问题标题】:Alarm Manager is not activating broadcast receiver?警报管理器没有激活广播接收器?
【发布时间】:2013-03-07 09:30:45
【问题描述】:

我正在开发一个应用程序,我在其中使用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();

}

}

我的警报接收器:

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>

我无法弄清楚问题出在哪里。请帮我摆脱它。谢谢!

【问题讨论】:

  • 你查过时间了吗,对吗?你在用公历吗
  • 是的,我认为时间是正确的,因为我也将它显示在我的列表中,它显示了正确的时间。
  • 这听起来很愚蠢,但你检查过 scheduleTime 是在未来吗? (这是触发警报的绝对时间,而不是警报响起之前经过的时间)。抱歉,如果您已经知道并检查过。
  • 这是关于其他日历的年份问题,但如果您已经检查过,除了 addAlram 之外的其他方法一定没问题
  • @NeilTownsend,是的,我已经检查过不允许用户输入过去的时间。

标签: android broadcastreceiver alarmmanager android-pendingintent


【解决方案1】:

http://www.vogella.com/articles/AndroidBroadcastReceiver/article.html 中提供了有关使用广播接收器的一个很好的教程。本质上,您的接收器不会声明它将接收什么事件。 Manifest 文件中的声明需要如下内容:

 <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

【讨论】:

  • @Neil...这是一个与时间有关的问题。那不是在一个地方更新的。
  • 我遇到了同样的问题,所以请@UsamaSarwar 告诉我解决方案是什么;和时区有关吗?
【解决方案2】:

我知道这个问题已经得到解答,但只是为了进一步参考,因为我遇到了同样的问题,请确保您的接收者标签在标签内,但不在任何其他标签内,例如活动(这正是问题所在我有)。

此外,检查您的警报是否已成功注册也很有帮助,因此运行: adb shell dumpsys 告警

【讨论】:

    【解决方案3】:

    您只需向警报管理器注册您的接收器,这将在每 60 秒后调用一次广播:

    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      相关资源
      最近更新 更多