1. 程式人生 > >Android獲取當前電量資訊(BroadcastReceiver的使用)

Android獲取當前電量資訊(BroadcastReceiver的使用)

廣播分為靜態廣播動態廣播,其實非常容易理解:

靜態廣播就是我們在xml檔案中的application註冊的廣播,當我們退出應用時,廣播依然在執行。
動態廣播是我們在程式碼中註冊的廣播,比如在activity中註冊的廣播,它的生命週期隨著activity的結束而結束。

下面主要介紹一下動態註冊廣播獲取當前電量資訊,從BroadcastReceive中獲取電量資訊,並傳遞給activity,顯示在textview中

xml檔案中只有一個textview

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">
<TextView android:id="@+id/textview" android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="當前電池電量" android:textSize="25dp" />
</RelativeLayout>

定義一個MyReceiver繼承BroadcastReceiver,重寫onReceive()方法,在方法中獲取電量的資訊

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //獲取當前電量
        int
level = intent.getIntExtra("level", 0); //電量的總刻度 myListener.onListener(level+""); System.out.println(level + "%"); } //設定監聽回撥,用於把電量的資訊傳遞給activity public MyListener myListener; public interface MyListener { public void onListener(String level); } public void setMyListener(MyListener myListener) { this.myListener = myListener; } }

在MainActivity中通過意圖過濾器來註冊廣播,IntentFilter是對意圖進行過濾的,就是我想要接收哪些廣播,不想接收哪些廣播,主要過濾Intent中Action,Data和Category的欄位。
intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);中Intent的引數ACTION_BATTERY_CHANGED,通過看原始碼知這是一個系統級別廣播,作用就是獲取當明電池的資訊;
這裡寫圖片描述
在MainActivity中的程式碼如下

public class MainActivity extends ActionBarActivity implements MyReceiver.MyListener {
    MyReceiver myReceiver;
    private TextView textview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textview = (TextView) findViewById(R.id.textview);
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
        myReceiver = new MyReceiver();
        registerReceiver(myReceiver, intentFilter);
        myReceiver.setMyListener(this);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myReceiver);
    }
    //通過回撥,得到BroadcastReceiver中的電量使用情況,並且設定給textview;
    @Override
    public void onListener(String level) {
        textview.setText(level + "%");
    }
}

最後執行結果:
這裡寫圖片描述
注:如果我們不退出activity時,電池的電量隨著時間變化而變化,比如我們如果在充電,就是在textview中看到電量的上升,但我們退出activity時,廣播已經取消了,再次進行的時候,是重新獲取的。
還有一點,就是我們在程式碼是註冊的廣播一定要在適合的時候登出,有人可能問activity關閉,廣播不是不起作用了嗎,為什麼一定要關閉呢。如果沒有及時關閉廣播,廣播在原有的activity中並不會登出,這是比較耗費記憶體資源的,因此對於在程式碼中註冊的廣播都要手工關閉,在onDestory()方法中登出就可以了。