当应用程序在后台时从广播接收器向服务发送 Intent 时出现 NullPointerException

NullPointerException while sending Intent from Broadcast Receiver to Services when App is in background

我正在开发一个应用程序,我正在使用 alarmManager 为其设置警报,当广播接收器收到未决意图时,我将其传递给服务 class 以显示 notification.and 也传递了一个意图当我的应用程序处于后台时,检查要报警的类型 received.but 它停止工作,因为它从 intent 接收到空值。 这是我的代码:

在 MainActivity.java 中:

     @Override
      protected Dialog onCreateDialog(int id) {

            if (id == DIALOG_ID) {
        return new TimePickerDialog(MainActivity.this, kTimePickerListener, 
        hour, min, false);
       }
          return null;
       }

         protected TimePickerDialog.OnTimeSetListener kTimePickerListener =
           new TimePickerDialog.OnTimeSetListener() {

        @Override
        public void onTimeSet(TimePicker timePicker, int hourofday, int 
        minutes) {
            hour = hourofday;
            min = minutes;

            Calendar calendar = Calendar.getInstance();

            // set selected time from timepicker to calendar

            calendar.set(Calendar.HOUR_OF_DAY, hour);
            calendar.set(Calendar.MINUTE, minutes);

            Intent myIntent = new Intent(MainActivity.this, 
            ServiceManager.class);
            myIntent.putExtra("reqcode", 11);

            // A PendingIntent specifies an action to take in the
            // future
            PendingIntent mPendingIntent = 
            PendingIntent.getBroadcast(MainActivity.this, 11, myIntent, 0);

            // set alarm time
             alarmManager = (AlarmManager) MainActivity.this
                    .getSystemService(Context.ALARM_SERVICE);
            alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), 
           mPendingIntent);

        }
    };

我正在发送请求代码为 11 的待处理代码,并通过 myIntent.putExtra("reqcode", 11);[= 通过 pendingintent 发送意图15=]

在我的ServiceManager.class中:

            public class ServiceManager extends BroadcastReceiver 
            {

            @Override
            public void onReceive(Context context, Intent intent) {

            int Noti_code = intent.getIntExtra("reqcode",-1);

            Intent myIntent = new Intent(context,NotificationService.class);
                  myIntent.putExtra("reqcode", Noti_code);
                  context.startService(myIntent);
              }
            }

在这里,我将此代码作为 Noti_code 通过 Intent 传递给我的 NotificationServices.class。

这里是NotificationServices.class:

         public class NotificationService extends Service {

         private NotificationManager mManager;

         @Override
           public IBinder onBind(Intent arg0) {
            // TODO Auto-generated method stub
              return null;
             }

         @Override
          public void onCreate() {
           super.onCreate();
           }

         @SuppressWarnings({"static-access", "deprecation"})
         @Override
         public void onStart(Intent intent, int startId) {
            super.onStart(intent, startId);

    **int Noti_Code = intent.getIntExtra("reqcode",-2);** //App crashes here

       if (Noti_Code == 11) {
    mManager = (NotificationManager) this.getApplicationContext().getSystemService(this.getApplicationContext().NOTIFICATION_SERVICE);
    ShowNotification(getApplicationContext(), mManager);
}
           }

         @Override
          public void onDestroy() {
           // TODO Auto-generated method stub
            super.onDestroy();
              }
            }

当我的应用处于后台时 它在这里崩溃 int Noti_Code = intent.getIntExtra("reqcode",-2);

这是我的 Menifest.xml :

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

           <application
              android:allowBackup="true"
              android:icon="@mipmap/ic_launcher"
              android:label="@string/app_name"
              android:roundIcon="@mipmap/ic_launcher_round"
              android:supportsRtl="true"
              android:theme="@style/AppTheme">
          <activity android:name=".MainActivity">
          <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
      </activity>
      <activity android:name=".Activity_detail" />
      <activity android:name=".History" />

      <service
        android:name=".NotificationService"
        android:enabled="true"
        android:exported="true"
        android:stopWithTask="false"/>
     <receiver android:name=".ServiceManager"/>
     </application>

这是 Logcat:

     Process: com.spendless.spendless_financiallifestylesavingapp, PID: 3910                                                                     
     java.lang.RuntimeException: Unable to start service 
     com.spendless.spendless_financiallifestylesavingapp.Services.NotificationService@5f7f8c2 with null: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.content.Intent.getIntExtra(java.lang.String, int)' on a null object reference
                                                                                                   at android.app.ActivityThread.handleServiceArgs(ActivityThread.java)
                                                                                                   at android.app.ActivityThread.access00(ActivityThread.java)
                                                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java)
                                                                                                   at android.os.Handler.dispatchMessage(Handler.java)
                                                                                                   at android.os.Looper.loop(Looper.java)
                                                                                                   at android.app.ActivityThread.main(ActivityThread.java)
                                                                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
                                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
                                                                                                Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.content.Intent.getIntExtra(java.lang.String, int)' on a null object reference
                                                                                                   at com.spendless.spendless_financiallifestylesavingapp.Services.NotificationService.onStart(NotificationService.java:46)
                                                                                                   at android.app.Service.onStartCommand(Service.java)
                                                                                                   at android.app.ActivityThread.handleServiceArgs(ActivityThread.java) 
                                                                                                   at android.app.ActivityThread.access00(ActivityThread.java) 
                                                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java) 
                                                                                                   at android.os.Handler.dispatchMessage(Handler.java) 
                                                                                                   at android.os.Looper.loop(Looper.java) 
                                                                                                   at android.app.ActivityThread.main(ActivityThread.java) 
                                                                                                   at java.lang.reflect.Method.invoke(Native Method) 
                                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java) 
                                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java) 

如果我的代码中缺少什么,请帮助我? 谢谢。

您已经在 Service 中实现了 onStart()。这不是正确的方法。您应该实施 onStartCommand()。来自 onStartCommand() 的 return 值告诉 Android 是否在特定条件下重新启动您的 Service 以及如何重新传送任何 Intent。使用 onStart() 有一些向后兼容性支持,自动提供值 START_STICKY 来控制 Service 的重启。这告诉 Android 您希望 Service 一直重新启动。

您可能看到的是 Android 以 null Intent 重新启动了您的 Service。如果 Android 杀死你的 Service 然后自动重启它(因为你 return START_STICKY),就会发生这种情况。

参见 Service 上的 documentation 以及 onStart()onStartCommand()