接收器类不识别ACTION_BATTERY_CHANGED

时间:2016-04-18 17:03:02

标签: android broadcastreceiver battery

我希望在电池电量充足时播放声音作为通知。

在我的接收器课程中,我为" power connected"并且"电源断开"他们工作正常!

但是我的接收器没有识别出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));
  }
}

编辑: Service和Broadcase Receiver有什么区别?我尝试了服务,但仍然没有得到任何结果

1 个答案:

答案 0 :(得分:0)

来自documentation

  

您无法通过清单中声明的​​组件接收此内容,只能通过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;
    }
}

您可以通过将服务置于前台来降低服务被杀的可能性(谷歌"前台服务")。

正如http://developer.android.com/preview/behavior-changes.html#bg-opt中所提到的,一些隐含的意图正在消失,所以要做好准备ACTION_BATTERY_CHANGED将会在其中。