Java 在非活动类中注册BroadcastReceiver

Java 在非活动类中注册BroadcastReceiver,java,android,xml,broadcastreceiver,android-context,Java,Android,Xml,Broadcastreceiver,Android Context,我必须在一个我必须在活动中调用的类中使用广播接收器。显然,我必须注册广播接收器,然后我编写了以下代码: public class MyClassName { Context context; BroadcastReceiver batteryInfoReceiverLevel; public void CheckBatteryLevel() { Log.d("App", "I'm in the CheckBattery

我必须在一个我必须在活动中调用的类中使用广播接收器。显然,我必须注册广播接收器,然后我编写了以下代码:

    public class MyClassName {

        Context context;
        BroadcastReceiver batteryInfoReceiverLevel;

        public void CheckBatteryLevel() {

        Log.d("App", "I'm in the CheckBatteryLevel");

        context.registerReceiver(batteryInfoReceiverLevel, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

        batteryInfoReceiverLevel = new BroadcastReceiver() {

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

            Log.d("Apps", "I'm in the onReceive");

            int level= intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);

            if(level <=100) {
//Do something

            }

            else if(level >=100) {
//Do something
            }

            }

            };

        }

    }
我该怎么修理

应用程序崩溃,导致“接收广播意图时出错”

因为
context
为空,所以在调用
registerReceiver
之前,您应该需要初始化
context
。对于初始化,请使用类构造函数或从调用活动传递到
CheckBatteryLevel
方法:

public void CheckBatteryLevel(Context aContext) {

context =aContext;
//....your code here...
}

这里有两个问题:

ρаσѕρєаK指出了第一点:

通过向方法CheckBatteryLevel()或构造函数添加参数来初始化上下文 我的班级

public class MyClass(Context ctx) {
    context = ctx;
}
其次,您必须在初始化BroadcastReceiver之后调用registerReceiver(..),否则它将为null且未注册

总而言之,这应该做到:

public class MyClassName {

    BroadcastReceiver batteryInfoReceiverLevel;

    public void CheckBatteryLevel(Context ctx) {

        Log.d("App", "I'm in the CheckBatteryLevel");

        batteryInfoReceiverLevel = new BroadcastReceiver() { // init your Receiver

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

                Log.d("Apps", "I'm in the onReceive");
                int level= intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);
                if(level <=100) {
                    //Do something
                } else if(level >=100) {
                    //Do something
                }
            }
        };
        // register your Receiver after initialization 
        ctx.registerReceiver(batteryInfoReceiverLevel,
                  new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
    }
}
公共类MyClassName{
广播接收机电池预测电平;
公共无效CheckBatteryLevel(上下文ctx){
Log.d(“应用程序”,“我在检查电池级别”);
batteryForeceiverLevel=new BroadcastReceiver(){//init您的接收器
@凌驾
公共void onReceive(上下文、意图){
Log.d(“应用程序”,“我在onReceive中”);
int-level=intent.getIntExtra(BatteryManager.EXTRA_-level,0);
如果(级别=100){
//做点什么
}
}
};
//初始化后注册您的接收器
ctx.注册接收装置(蓄电池预测液位,
新的IntentFilter(Intent.ACTION_BATTERY_CHANGED);
}
}

请发布完整的堆栈跟踪。谢谢,它可以工作,但为什么不输入OnReceive方法?错误在哪里?@MarioG.:您是否在logcat中获得
Log.d(“应用程序”,“我在OnReceive中”);
public class MyClassName {

    BroadcastReceiver batteryInfoReceiverLevel;

    public void CheckBatteryLevel(Context ctx) {

        Log.d("App", "I'm in the CheckBatteryLevel");

        batteryInfoReceiverLevel = new BroadcastReceiver() { // init your Receiver

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

                Log.d("Apps", "I'm in the onReceive");
                int level= intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);
                if(level <=100) {
                    //Do something
                } else if(level >=100) {
                    //Do something
                }
            }
        };
        // register your Receiver after initialization 
        ctx.registerReceiver(batteryInfoReceiverLevel,
                  new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
    }
}