Android的BroadcastReceiver在BOOT_COMPLETED事件下无法启动闹钟。

3
我将尝试使用一种相对简单的解决方案来执行一些启动代码。基本上,我想在启动时安排/重新安排闹钟,在未来执行某个任务。
在我的清单中,我有:
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<receiver android:name="com.cswt.lcyairport.alarm.AlarmReceiver">
     <intent-filter>
          <action android:name="android.intent.action.BOOT_COMPLETED"/>
     </intent-filter>
</receiver>

这是我的代码:

@Override
public void onReceive(Context context, Intent intent) {
    this.context = context;

    String action = intent.getAction();
    if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {

        // Setup alarm
        scheduleAlarm();

        //Intent pushIntent = new Intent(context, MainActivity.class); 
        //pushIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        //context.startActivity(pushIntent);

    }

}

private void scheduleAlarm() {
    long interval = 10*1000;

    Intent intentAlarm = new Intent(AlarmReceiver.ACTION_GO_TO_GATE);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarmManager = (AlarmManager)       context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 10000, interval, pendingIntent);
}

如果我取消注释以启动活动,它将正常工作,并且我可以看到BOOT_COMPLETED被我的接收器捕获。然而,尝试启动闹钟不起作用(也尝试显示通知,但它也不起作用)。我该怎么解决这个问题?

你是否已经注册了你的接收器? - Harshit Rathi
显然我不需要...如果我想打开一个活动,它可以工作。 - Rui
1
你是否为AlarmReceiver.ACTION_GO_TO_GATE注册了BroadcastReceiver?如果是的话,你是在清单文件中完成的吗? - Suau
3个回答

2

在设备重新启动后,您需要使用不同的请求代码并将它们保存在某个地方以便再次使用。您必须使用与设置闹铃时使用的相同的请求代码来使用 PendingIntent ,然后在设备重新启动后才能正常工作。此外,您还必须确保不会再次使用请求代码,因为假设您使用请求代码0和 PendingIntent 设置了一个闹铃,如果您再次使用请求代码0设置另一个闹铃,则您之前的闹铃将被新的替换掉,因此您将无法获得第一个闹铃。

编辑:使用以下代码片段设置闹钟

public void SetAlarm(Calendar calendar, int reqCode) { 

 String dateName = idea.getText().toString(); String dateNote = 
 note.getText().toString(); Log.d("SetAlarm Texts", "Date : " + dateName + " 
 Note: " + dateNote);

Intent myIntent = new Intent(mActivity, AlarmReceiver.class);

myIntent.putExtra("title", "Her : " + dateName);

myIntent.putExtra("notes", dateNote);

myIntent.putExtra("code", reqCode);

PendingIntent pendingIntent = PendingIntent.getBroadcast(mActi vity, reqCode, myIntent, 0); 

AlarmManager alarmManager = (AlarmManager) mActivity.getSystemService(Context.ALARM_ SERVICE);

alarmManager.set(AlarmManager.RT C, calendar.getTimeInMillis(), pendingIntent);

}

这似乎没有意义。在启动时,我正在设置一个闹钟,所以我不会在这里重复请求代码。 - Rui
通过服务设置闹钟。使用代码片段设置闹钟。 - ayon

1

在使用getService、getActivity或getBroadCast创建待处理意图时,必须使用FLAG_UPDATE_CURRENT标志,以便保留当前的待处理意图。 它不会替换它。 请参考此链接http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_UPDATE_CURRENT

Intent in = new Intent(arg0, Myservice.class);
PendingIntent pin = PendingIntent.getService(arg0, 0, in,PendingIntent.FLAG_UPDATE_CURRENT);
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis() + 1000 * 60);
AlarmManager am = (AlarmManager) arg0.getApplicationContext().getSystemService(arg0.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC, cal.getTimeInMillis(), 30 * 1000, pin);

0

你在清单文件中添加了必要的权限吗?

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

我帖子的第二行。 - Rui
抱歉,我错过了那个。您能否添加代码,以便您的广播接收器可以对AlarmReceiver.ACTION_GO_TO_GATE进行操作? - Suau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接