【发布时间】: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