在非活动类中注册BroadcastReceiver

Mar*_* G. 5 java xml android broadcastreceiver android-context

我必须在一个我必须在Activity中调用的类中使用BroadcastReceiver.显然,我必须注册BroadcastReceiver然后我写了这段代码:

    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
            }

            }

            };

        }

    }
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,应用程序崩溃给出" Error receiving broadcast Intent { act=android.intent.action.BATTERY_CHANGED flg=0x60000010 (has extras) }并且崩溃线是

context.registerReceiver(batteryInfoReceiverLevel, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

Ste*_*ett 2

这里有两个问题:

\n\n

\xcf\x81\xd1\x8f\xcf\x83\xd1\x95\xcf\x81\xd1\x94\xd1\x8f K 指出了第一个:

\n\n

通过将参数添加到方法 CheckBatteryLevel() 或 MyClass 的构造函数\n来初始化上下文

\n\n
public class MyClass(Context ctx) {\n    context = ctx;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

其次,您必须在初始化 BroadcastReceiver 后调用 registerReceiver(..)。否则它将为空且未注册。

\n\n

总而言之,应该这样做:

\n\n
public class MyClassName {\n\n    BroadcastReceiver batteryInfoReceiverLevel;\n\n    public void CheckBatteryLevel(Context ctx) {\n\n        Log.d("App", "I\'m in the CheckBatteryLevel");\n\n        batteryInfoReceiverLevel = new BroadcastReceiver() { // init your Receiver\n\n            @Override\n            public void onReceive(Context context, Intent intent) {\n\n                Log.d("Apps", "I\'m in the onReceive");\n                int level= intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);\n                if(level <=100) {\n                    //Do something\n                } else if(level >=100) {\n                    //Do something\n                }\n            }\n        };\n        // register your Receiver after initialization \n        ctx.registerReceiver(batteryInfoReceiverLevel,\n                  new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); \n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n