接收器 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 有什么区别?我尝试了该服务,但仍然没有得到任何结果

来自documentation

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 将在其中。