当应用程序在后台时从广播接收器向服务发送 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()
。
我正在开发一个应用程序,我正在使用 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()
。