接收器 class 无法识别 ACTION_BATTERY_CHANGED
Receiver class doesn't recognize ACTION_BATTERY_CHANGED
我想在电池充满时播放声音作为通知。
在我的接收器 class 中,我又为 "power connected" 和 "power disconnected" 写了 2 个通知,它们工作正常!
但我的接收器无法识别 ACTION_BATTERY_CHANGED。我搜索了很多,发现我必须以编程方式注册它。
问题是我需要在没有任何 Activity 的情况下注册它。因为我想通知 "Battery_Fully_charged" 即使我的程序没有 运行.
如何在我的接收器 ("MyReceiver.class") 中注册这样的东西?
这是我找到的示例代码,它可以正常工作。但我想在没有 Activity.
的情况下进行
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));
}
}
编辑:
Service 和 Broadcase Receiver 有什么区别?我尝试了该服务,但仍然没有得到任何结果
You cannot receive this through components declared in manifests, only by explicitly registering for it with Context.registerReceiver()
. [...]
这意味着:
1) 只有 BroadcastReceiver
可以接收这些 intent。
2) 只有动态注册的接收器才能接收这些意图。
您已经了解如何在 activity 中执行此操作让我们看一下服务:
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 "foreground service")。
如 http://developer.android.com/preview/behavior-changes.html#bg-opt 中所述,一些隐式意图将消失,因此请做好准备 ACTION_BATTERY_CHANGED
将在其中。
我想在电池充满时播放声音作为通知。
在我的接收器 class 中,我又为 "power connected" 和 "power disconnected" 写了 2 个通知,它们工作正常!
但我的接收器无法识别 ACTION_BATTERY_CHANGED。我搜索了很多,发现我必须以编程方式注册它。
问题是我需要在没有任何 Activity 的情况下注册它。因为我想通知 "Battery_Fully_charged" 即使我的程序没有 运行.
如何在我的接收器 ("MyReceiver.class") 中注册这样的东西?
这是我找到的示例代码,它可以正常工作。但我想在没有 Activity.
的情况下进行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));
}
}
编辑: Service 和 Broadcase Receiver 有什么区别?我尝试了该服务,但仍然没有得到任何结果
You cannot receive this through components declared in manifests, only by explicitly registering for it with
Context.registerReceiver()
. [...]
这意味着:
1) 只有 BroadcastReceiver
可以接收这些 intent。
2) 只有动态注册的接收器才能接收这些意图。
您已经了解如何在 activity 中执行此操作让我们看一下服务:
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 "foreground service")。
如 http://developer.android.com/preview/behavior-changes.html#bg-opt 中所述,一些隐式意图将消失,因此请做好准备 ACTION_BATTERY_CHANGED
将在其中。