AlarmManager从不在AlarmReceiver / BroadcastReceiver中调用onReceive

我仍然无法触发我的AlarmReceiver类’onReceive方法。 这个实现有什么问题吗?

所有这一切应该是等待一段时间(最好是6天),然后弹出一个通知。 (你能相信没有内置系统吗?crontab任何人!?)

MyActivity和BootReceiver都在必要条件下设置了警报。 AlarmService启动通知。 并且AlarmReceiver 应该捕获警报并启动AlarmService,但它从未捕获过该广播,并且无论我做什么都不会。

哦,我一直在测试我的Droid X,2.3.4。 项目是针对API 8构建的。

PS大部分内容改编自http://android-in-practice.googlecode.com/svn/trunk/ch02/DealDroidWithService/

———— MyActivity.java ————

public class MyActivity extends Activity implements SensorEventListener { private void setupAlarm() { Log.i(TAG, "Setting up alarm..."); AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 1, new Intent(context, AlarmReceiver.class), 0); // Get alarm trigger time from prefs Log.i(TAG, "Getting alarm trigger time from prefs..."); SharedPreferences mPrefs2 = PreferenceManager.getDefaultSharedPreferences(context); long trigger = SocUtil.getLongFromPrefs(mPrefs2, AlarmConst.PREFS_TRIGGER); Log.i(TAG, "Trigger from prefs: " + trigger + " (" + new Date(trigger).toString() + ")."); // If alarm trigger is not set if(trigger == new Long(-1).longValue()) { // Set it trigger = new Date().getTime() + NOTIFY_DELAY_MILLIS; SocUtil.saveLongToPrefs(mPrefs2, AlarmConst.PREFS_TRIGGER, trigger); Log.i(TAG, "Trigger changed to: " + trigger + " (" + new Date(trigger).toString() + ")."); // And schedule the alarm alarmMgr.set(AlarmManager.RTC, trigger, pendingIntent); Log.i(TAG, "Alarm scheduled."); } // If it is already set else { // Nothing to schedule. BootReceiver takes care of rescheduling it after a reboot } } } 

———— AlarmService.java ————

 public class AlarmService extends IntentService { public AlarmService() { super("AlarmService"); } @Override public void onHandleIntent(Intent intent) { Log.i(AlarmConst.TAG, "AlarmService invoked."); this.sendNotification(this); } private void sendNotification(Context context) { Log.i(AlarmConst.TAG, "Sending notification..."); Intent notificationIntent = new Intent(context, Splash.class); PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); NotificationManager notificationMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = new Notification(R.drawable.icon, "Test1", System.currentTimeMillis()); notification.setLatestEventInfo(context, "Test2", "Test3", contentIntent); notificationMgr.notify(0, notification); } } 

———— AlarmReceiver.java ————

 public class AlarmReceiver extends BroadcastReceiver { // onReceive must be very quick and not block, so it just fires up a Service @Override public void onReceive(Context context, Intent intent) { Log.i(AlarmConst.TAG, "AlarmReceiver invoked, starting AlarmService in background."); context.startService(new Intent(context, AlarmService.class)); } } 

———— BootReceiver.java ————(恢复已擦除的警报,因为我在操作系统中安排的内容不够重要,无法通过重启 -_-)

 public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.i(AlarmConst.TAG, "BootReceiver invoked, configuring AlarmManager..."); Log.i(AlarmConst.TAG, "Setting up alarm..."); AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 1, new Intent(context, AlarmReceiver.class), 0); // Get alarm trigger time from prefs Log.i(AlarmConst.TAG, "Getting alarm trigger time from prefs..."); SharedPreferences mPrefs2 = PreferenceManager.getDefaultSharedPreferences(context); long trigger = SocUtil.getLongFromPrefs(mPrefs2, AlarmConst.PREFS_TRIGGER); Log.i(AlarmConst.TAG, "Trigger from prefs: " + trigger + " (" + new Date(trigger).toString() + ")."); // If trigger exists in prefs if(trigger != new Long(-1).longValue()) { alarmMgr.set(AlarmManager.RTC, trigger, pendingIntent); Log.i(AlarmConst.TAG, "Alarm scheduled."); } } } 

————清单————

           

以下是我最近用于每小时发出通知的一些代码(这是在我的MainActivity中):

 AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); Intent Notifyintent = new Intent(context, Notify.class); PendingIntent Notifysender = PendingIntent.getBroadcast(this, 0, Notifyintent, PendingIntent.FLAG_UPDATE_CURRENT); am.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 3600000, Notifysender); 

然后在Notify.java中

 import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class Notify extends BroadcastReceiver{ @SuppressWarnings("deprecation") @Override public void onReceive(Context context, Intent intent) { NotificationManager myNotificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); Notification notification = new Notification(R.drawable.ic_launcher, "Update Device", 0); Intent notificationIntent = new Intent(context, MainActivity.class); PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); notification.setLatestEventInfo(context, "Device CheckIn", "Please run Device CheckIn", contentIntent); notification.flags |= Notification.FLAG_HIGH_PRIORITY; myNotificationManager.notify(0, notification); } } 

最后在AndroidManifest.xml中,我在标签之间有这个:

                  

我知道我在办公室工作的主要代码,随时向我发送电子邮件以获得更多帮助,因为我遇到了同样的问题。

电子邮件:mit.edu的sbrichards

您必须使用intent Action注册AlarmReceiver。 如下。 并且动作字符串必须与sendBroadcast()方法广播的动作相同。

sendBroadcast(new Intent(""com.intent.action.SOMEACTION.XYZ""));

       

我甚至没有使用BroadcastReceiver解决了这个问题。 我读到的关于如何进行通知警报(并且很多)的每一篇教程和post都说使用了BroadcastReceiver ,但显然我不明白某些东西,或者那是一堆垃圾。

现在我让AlarmManager设置一个警报,其中一个Intent直接转到我创建的新Activity 。 我仍然使用BootReceiver在重启后重置该警报。

这使得通知在应用内,应用程序外工作,应用程序进程被终止,并在重新启动后。

感谢您的其他评论者。