当电池充放电时,我想播放一个声音作为通知。
在我的接收类中,我又写了2个“电源连接”和“电源断开”的通知,它们工作正常!
但我的接收器不认识ACTION_BATTERY_CHANGED。我已经搜索了很多,我发现我必须以编程方式注册它。
问题是我需要在没有任何活动的情况下注册它。因为我想通知"Battery_Fully_charged“,即使我的程序没有运行。
我如何在我的接收器("MyReceiver.class")中注册这样的东西?
下面是我找到的示例代码,它可以工作。但我想在没有活动的情况下去做。
public class Main extends Activity {
private TextView batteryTxt;
private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context ctxt, Intent intent) {
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
batteryTxt.setText(String.valueOf(level) + "%");
}
};
@Override
public void onCreate(Bundle b) {
super.onCreate(b);
setContentView(R.layout.main);
batteryTxt = (TextView) this.findViewById(R.id.batteryTxt);
this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
}
}编辑:服务和大写接收者有什么区别?我试过了,但还是没有得到任何结果
发布于 2016-04-18 17:57:36
来自文档
只有通过
Context.registerReceiver()显式注册才能通过清单中声明的组件来接收它。..。
这意味着:
1)只有BroadcastReceiver才能接收到这些意图。
2)只有动态注册的接收机才能接收到这些意图。
您已经了解了如何在活动中这样做--让我们看看服务:
public class MyService extends Service {
private final IntentFilter batteryIntentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
private final BroadcastReceiver batteryReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context ctxt, Intent intent) {
// React.
}
};
public void onCreate() {
super.onCreate();
registerReceiver(batteryReceiver, batteryIntentFilter);
}
public void onDestroy() {
unregisterReceiver(batteryReceiver);
super.onDestroy();
}
public int onStartCommand (Intent intent, int flags, int startId) {
return START_STICKY;
}
}您可以通过将服务放到前台(google“前台服务”)来减少该服务被杀死的可能性。
正如在http://developer.android.com/preview/behavior-changes.html#bg-opt中提到的,一些隐含的意图正在消失,因此要做好准备,ACTION_BATTERY_CHANGED将成为其中之一。
https://stackoverflow.com/questions/36700088
复制相似问题