Android獲取當前電量資訊(BroadcastReceiver的使用)
阿新 • • 發佈:2019-02-19
廣播分為靜態廣播和動態廣播,其實非常容易理解:
靜態廣播就是我們在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()方法中登出就可以了。