【问题标题】:NullPointerException while sending Intent from Broadcast Receiver to Services when App is in background当应用程序在后台时,从广播接收器向服务发送 Intent 时出现 NullPointerException
【发布时间】:2018-09-06 19:19:28
【问题描述】:

我正在开发一个应用程序,我正在使用 alarmManager 设置警报,当广播接收器收到待处理的意图时,我将其传递给服务类以显示通知。并且还传递了一个意图来检查警报的类型收到。但是当我的应用程序在后台时,它停止工作,因为它从 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 发送一个意图

在我的 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.access$2200(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.access$2200(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) 

如果我的代码中缺少某些内容,请帮助我? 谢谢。

【问题讨论】:

  • 您的intent 为空
  • 这就是我要问的?我的代码中缺少哪里?你能解释一下吗?
  • 当没有传递任何参数时,它可能总是为空。
  • 在产生负面影响之前请仔细阅读代码。我正在将参数传递给意图,这是我通过的地方。我还通过调试来检查它是否在应用程序处于前台时找到工作。 int Noti_code = intent.getIntExtra("reqcode",-1);意图 myIntent = new Intent(context,NotificationService.class); myIntent.putExtra("reqcode", Noti_code); context.startService(myIntent);

标签: android android-intent broadcastreceiver alarmmanager android-pendingintent


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    相关资源
    最近更新 更多