【问题标题】:android BroadcastReceiver sometimes throws NullPointerException at onReceiveandroid BroadcastReceiver 有时会在 onReceive 抛出 NullPointerException
【发布时间】:2013-09-19 05:40:14
【问题描述】:

我有一个从 AlarmManager 定期调用的 BroadcastReceiver 这是广播接收器:

package com.panic.receiver;

import com.panic.service.MyService;
import com.panic.utils.Analytics;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
import android.util.Log;

public class KeepAliveReceiver extends BroadcastReceiver {
final String TAG = "PeriodicUpdateReceiver";
private static MyService mService;

@Override
public void onReceive(Context context, Intent intent) {
    try {
        Log.v(TAG, "onReceive");
        PowerManager pm = (PowerManager)mService.getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "PanicButton");
        //Acquire the lock
        wl.acquire();
        mService.sendKeepAlive();
        //Release the lock
        wl.release();
    }
    catch(Exception ex) {
        Analytics.sendException("KeepAliveReceiver onReceive", ex, false);
    }

}


public void startPeriodicUpdates(MyService service, int time)
{
    mService = service;
    AlarmManager am=(AlarmManager)mService.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(mService, KeepAliveReceiver.class);
    PendingIntent pi = PendingIntent.getBroadcast(mService, 0, intent, 0);
    //After after 30 seconds
    am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), time , pi); 
}
}

接收器每小时调用一次,它运行良好,但有时(很少)我得到以下异常:

java.lang.RuntimeException: Unable to start receiver        com.ex.receiver.KeepAliveReceiver: java.lang.NullPointerException
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2277)
at android.app.ActivityThread.access$1500(ActivityThread.java:140)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4898)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.ex.receiver.KeepAliveReceiver.onReceive(KeepAliveReceiver.java:19)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2270)
... 10 more

第 19 行是函数头: public void onReceive(Context context, Intent intent) {

为什么会这样?

【问题讨论】:

  • 您可能在活动中注册了接收器,但忘记在正确的生命周期方法中取消注册。
  • 注册在一个一直运行的服务中
  • 您发送到 onReceive 方法的意图可能是接收 NULL 指针。
  • 如果是这种情况,您应该在 mService 的 onReceive 方法中添加一个空检查,因为您可能还没有调用 startPeriodicUpdates,或者您的服务当时可能已关闭。

标签: android exception broadcastreceiver alarmmanager


【解决方案1】:

onReceive 方法中,使用context.getSystemService(...) 代替mService.getSystemService(..)

【讨论】:

    猜你喜欢
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    相关资源
    最近更新 更多