启动时启动警报不起作用

Start alarm on boot doesn't work

我创建了一个 BroadcastReceiver,我在其中启动了 3 个警报和 3 个通知,但我尝试了我的代码但它不起作用,警报没有触发。 我还尝试将通知代码包含到 if 条件中,但是当通知应该启动时,应用程序崩溃了。 这是我的 BroadcastReceiver 代码:

 @Override
    public void onReceive(Context context, Intent intent)
    {
         if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){
             setAlarm(context);
         }
        String keyid = intent.getStringExtra("number");
        String notif=PreferenceManager.getDefaultSharedPreferences(context).getString("notif", "abilitato");
        if(notif.equals("abilitato")){          
        if(keyid.equals("0")){
        Intent notificationIntent = new Intent(context, MainActivity.class);
        notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent contentIntent = PendingIntent.getActivity(context,
                        0, notificationIntent,
                        PendingIntent.FLAG_CANCEL_CURRENT);
        Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
         NotificationCompat.Builder mBuilder =
                    new NotificationCompat.Builder(context);
         mBuilder.setContentIntent(contentIntent)
                    .setSmallIcon(R.drawable.ic_launcher)
                    .setContentTitle("E' ora di colazione!")
                    .setContentText("Cosa c'è per colazione?")
                    .setSound(alarmSound)
                    .setLights(Color.BLUE, 1000, 500)
                    .setVibrate(new long[] { 1000, 1000})
                    .setAutoCancel(true);


                NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
                mNotificationManager.notify(1, mBuilder.build());
        }
        if(keyid.equals("1")){

            Intent notificationIntent = new Intent(context, MainActivity.class);
            notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            PendingIntent contentIntent = PendingIntent.getActivity(context,
                            1, notificationIntent,
                            PendingIntent.FLAG_CANCEL_CURRENT);
            Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
             NotificationCompat.Builder mBuilder2 =
                        new NotificationCompat.Builder(context);
             mBuilder2.setContentIntent(contentIntent)
                        .setSmallIcon(R.drawable.ic_launcher)
                        .setContentTitle("E' ora pranzo!")
                        .setContentText("Cosa c'è per pranzo?")
                        .setSound(alarmSound)
                        .setLights(Color.BLUE, 1000, 500)
                        .setVibrate(new long[] { 1000, 1000})
                        .setAutoCancel(true);

                    NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
                    mNotificationManager.notify(1, mBuilder2.build());
        }
        if(keyid.equals("2")){
            Intent notificationIntent = new Intent(context, MainActivity.class);
            notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            PendingIntent contentIntent = PendingIntent.getActivity(context,
                            2, notificationIntent,
                            PendingIntent.FLAG_CANCEL_CURRENT);
            Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
             NotificationCompat.Builder mBuilder3 =
                        new NotificationCompat.Builder(context);
                       mBuilder3.setContentIntent(contentIntent)
                        .setSmallIcon(R.drawable.ic_launcher)
                        .setContentTitle("E' ora cena!")
                        .setContentText("Cosa c'è per cena?")
                        .setSound(alarmSound)
                        .setLights(Color.BLUE, 1000, 500)
                        .setVibrate(new long[] { 1000, 1000})
                        .setAutoCancel(true);


                    NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
                    mNotificationManager.notify(1, mBuilder3.build());
            }
           }   

    }
    public void setAlarm(Context context){
        String breakfast1=PreferenceManager.getDefaultSharedPreferences(context).getString("breakfast", "abilitato"); 
        String lunch1=PreferenceManager.getDefaultSharedPreferences(context).getString("lunch", "abilitato"); 
        String dinner1=PreferenceManager.getDefaultSharedPreferences(context).getString("dinner", "abilitato"); 
        Database d;
        AlarmManager alarmManager;
        PendingIntent pendingIntent;
         d=new Database(context);
         String dataString=d.checkDataString();
          String n;

         //COLAZIONE
         int duepunti = breakfast1.indexOf(":");
         String hourColazione = breakfast1.substring(0,duepunti);
         int intHourColazione=Integer.parseInt(hourColazione);
         String minuteColazione = breakfast1.substring(duepunti + 1);
         int intMinuteColazione=Integer.parseInt(minuteColazione);

         int start = dataString.indexOf("/");
         String dayString = dataString.substring(0,start);
         String monthString = dataString.substring(start + 1,start+3);
         String yearString = dataString.substring(start+4);
         int day = Integer.parseInt(dayString);
         int month = Integer.parseInt(monthString);
         int year = Integer.parseInt(yearString); 
         Calendar calNow = Calendar.getInstance();
          Calendar c = (Calendar) calNow.clone();
          c.setTimeInMillis(System.currentTimeMillis());
          c.set(Calendar.YEAR, year);
          c.set(Calendar.MONTH, month-1);
          c.set(Calendar.DAY_OF_MONTH, day);
         c.set(Calendar.HOUR_OF_DAY, intHourColazione);
         c.set(Calendar.MINUTE, intMinuteColazione);
         c.set(Calendar.SECOND, 0);    
         c.set(Calendar.MILLISECOND, 0);
         if(c.after(System.currentTimeMillis())){
             c.add(Calendar.DAY_OF_MONTH, 1);
         }
         Intent myIntent = new Intent(context, MyReceiver.class);

         n="0";
         myIntent.putExtra("number", n);
         if(PendingIntent.getBroadcast(context, 0, 
                myIntent, 
                PendingIntent.FLAG_NO_CREATE) == null){

         pendingIntent = PendingIntent.getBroadcast(context, 0, myIntent,0);
         alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
         alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);

      }
       //PRANZO  
         int duepunti2 = lunch1.indexOf(":");
         String hourPranzo = lunch1.substring(0,duepunti2);
         int intHourPranzo=Integer.parseInt(hourPranzo);
         String minutePranzo = lunch1.substring(duepunti2 + 1);
         int intMinutePranzo=Integer.parseInt(minutePranzo); 

         Calendar calNow2 = Calendar.getInstance();
          Calendar c2 = (Calendar) calNow2.clone();
          c2.setTimeInMillis(System.currentTimeMillis());
          c2.set(Calendar.YEAR, year);
          c2.set(Calendar.MONTH, month-1);
          c2.set(Calendar.DAY_OF_MONTH, day);
         c2.set(Calendar.HOUR_OF_DAY, intHourPranzo);
         c2.set(Calendar.MINUTE, intMinutePranzo);
         c2.set(Calendar.SECOND, 0);    
         c2.set(Calendar.MILLISECOND, 0);
         if(c2.after(System.currentTimeMillis())){
             c2.add(Calendar.DAY_OF_MONTH, 1);
        }
         Intent myIntent2 = new Intent(context, MyReceiver.class);
         n="1";
         myIntent2.putExtra("number", n);
         if(PendingIntent.getBroadcast(context, 1, 
                myIntent2, 
                PendingIntent.FLAG_NO_CREATE) == null){

         pendingIntent = PendingIntent.getBroadcast(context, 1, myIntent2 ,0);
         alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
         alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c2.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);

      }
         //CENA
         int duepunti3 = dinner1.indexOf(":");
         String hourCena = dinner1.substring(0,duepunti3);
         int intHourCena=Integer.parseInt(hourCena);
         String minuteCena = dinner1.substring(duepunti3 + 1);
         int intMinuteCena=Integer.parseInt(minuteCena);
         Calendar calNow3 = Calendar.getInstance();
          Calendar c3 = (Calendar) calNow3.clone();
          c3.setTimeInMillis(System.currentTimeMillis());
          c3.set(Calendar.YEAR, year);
          c3.set(Calendar.MONTH, month-1);
          c3.set(Calendar.DAY_OF_MONTH, day);
          c3.set(Calendar.HOUR_OF_DAY, intHourCena);
          c3.set(Calendar.MINUTE, intMinuteCena);
          c3.set(Calendar.SECOND, 0);    
          c3.set(Calendar.MILLISECOND, 0);
          if(c.after(System.currentTimeMillis())){
             c.add(Calendar.DAY_OF_MONTH, 1);
         }

         Intent myIntent3 = new Intent(context, MyReceiver.class);
         n="2";
         myIntent3.putExtra("number", n);
         if(PendingIntent.getBroadcast(context, 2, 
                myIntent3, 
                PendingIntent.FLAG_NO_CREATE) == null){

         pendingIntent = PendingIntent.getBroadcast(context, 2, myIntent3,0);
         alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
         alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c3.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);

      }
    }

}

清单中:

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

...

 <receiver android:name="com.lp.lemiediete.MyReceiver">
     <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
    </receiver>

LogCat:

05-23 11:04:01.094: E/AndroidRuntime(5308): FATAL EXCEPTION: main
05-23 11:04:01.094: E/AndroidRuntime(5308): Process: com.lp.lemiediete, PID: 5308
05-23 11:04:01.094: E/AndroidRuntime(5308): java.lang.RuntimeException: Unable to start receiver com.lp.lemiediete.MyReceiver: java.lang.NullPointerException
05-23 11:04:01.094: E/AndroidRuntime(5308):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2426)
05-23 11:04:01.094: E/AndroidRuntime(5308):     at android.app.ActivityThread.access00(ActivityThread.java:135)
05-23 11:04:01.094: E/AndroidRuntime(5308):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1272)
05-23 11:04:01.094: E/AndroidRuntime(5308):     at android.os.Handler.dispatchMessage(Handler.java:102)
05-23 11:04:01.094: E/AndroidRuntime(5308):     at android.os.Looper.loop(Looper.java:136)
05-23 11:04:01.094: E/AndroidRuntime(5308):     at android.app.ActivityThread.main(ActivityThread.java:5021)
05-23 11:04:01.094: E/AndroidRuntime(5308):     at java.lang.reflect.Method.invokeNative(Native Method)
05-23 11:04:01.094: E/AndroidRuntime(5308):     at java.lang.reflect.Method.invoke(Method.java:515)
05-23 11:04:01.094: E/AndroidRuntime(5308):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827)
05-23 11:04:01.094: E/AndroidRuntime(5308):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643)
05-23 11:04:01.094: E/AndroidRuntime(5308):     at dalvik.system.NativeStart.main(Native Method)
05-23 11:04:01.094: E/AndroidRuntime(5308): Caused by: java.lang.NullPointerException
05-23 11:04:01.094: E/AndroidRuntime(5308):     at com.lp.lemiediete.MyReceiver.onReceive(MyReceiver.java:25)
05-23 11:04:01.094: E/AndroidRuntime(5308):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2419)
05-23 11:04:01.094: E/AndroidRuntime(5308):     ... 10 more

您正在 onReceive()Intent 上呼叫 getStringExtra("number")Intent 没有额外的键 "number",所以这将是 return null。然后你会在这里得到一个NullPointerException

    if(keyid.equals("0")){

也许您想在这段代码中调用 setAlarm() 后添加一个 return 语句:

     if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){
         setAlarm(context);
     }