Android 报警管理器没有';我不工作

Android 报警管理器没有';我不工作,android,alarmmanager,Android,Alarmmanager,我试着让闹钟工作,但它什么也没用,我错了什么? 我的代码是 Calendar cal = Calendar.getInstance(); Intent intent = new Intent(this, OnetimeAlarmReceiver.class); PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0); AlarmManager am = (AlarmMan

我试着让闹钟工作,但它什么也没用,我错了什么? 我的代码是

        Calendar cal = Calendar.getInstance();
    Intent intent = new Intent(this, OnetimeAlarmReceiver.class);
    PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);

    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
    am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis() + 3000, sender);
我的广播接收器是这样的

    public class OnetimeAlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();
    }
}
这是一个内部类


我缺少什么?

您必须注册广播接收器才能工作,它可以在AndroidManifest.xml中完成,也可以使用
Context.registerReceiver()方法动态完成

您可以阅读《开发人员指南》中关于注册接收者的内容,或者查看参考资料以了解如何执行此操作。

这是有效的代码

添加到Manifest.xml:

...
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
...
<receiver  android:process=":remote" android:name="Alarm"></receiver>
...

最好将OnetimeAlarmReceiver移到外部类。它不起作用,因为OnetimeAlarmReceiver(这是一个内部类,对吗?)不能在不实例化父类的情况下进行实例化。非常感谢这两个方面。我将它移动到一个外部类,并在清单中注册它,现在它工作得很好。
public class Alarm extends BroadcastReceiver 
{    
     @Override
     public void onReceive(Context context, Intent intent) 
     {   
         PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
         PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "YOUR TAG");
         wl.acquire();

         // Put here YOUR code.
         Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example

         wl.release();
     }

     public void SetAlarm(Context context)
     {
         AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
         Intent i = new Intent(context, Alarm.class);
         PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
         am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (1000 * 60 * 10), pi); // Millisec * Second * Minute
     }
}