廣播,這個詞我們不會陌生,不管你聽不聽,我們都懂!
收聽收音機就是一種廣播,在收音機中有多個廣播電台,每個廣播電台播放的內容都不相同。廣播電台主持人(發送方)並不在意我們(接收方)聽到廣播內容之後會如何處理。譬如我們聽到路況信息的廣播,電台廣播(發送方)告訴我們目前交通狀況如何,但它並不關心我們接收到廣播時做如何做出處理,這不是廣播應該關心的問題!
我們(接收方)可能很關心,開車選擇另一條線路;也可能我們“聽而不見”,可能這個線路擁堵與我們無關!
Android 中的廣播與之大同小異。
Android 的廣播機制
在Android 裡面有各種各樣的廣播,比如電池的使用狀態,電話的接收和短信的接收都會產生一個廣播。
一、設計界面
1、布局文件
打開res/layout/activity_main.xml文件。
輸入以下代碼:
[html] view plain copy
- <?xml version="1.0" encoding="utf-8" ?>
-
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
-
- <Button
- android:id="@+id/send"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="獲取電量" />
-
- </LinearLayout>
二、程序文件
打開“src/com.genwoxue.contentprovider_b/MainActivity.java”文件。
然後輸入以下代碼:
[java] view plain copy
- package com.genwoxue.broadcast;
-
-
- import android.os.BatteryManager;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.Toast;
- import android.app.Activity;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.content.IntentFilter;
-
- public class MainActivity extends Activity {
-
- private Button btnSend=null;
- private BroadcastReceiverUtil receiver=null;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- btnSend=(Button)super.findViewById(R.id.send);
- btnSend.setOnClickListener(new OnClickListener(){
- @Override
- public void onClick(View v){
- //實例化廣播接收器(接收方)
- receiver=new BroadcastReceiverUtil();
- //實例化廣播過濾器(只過濾電量)
- IntentFilter filter=new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
- //注冊BroadcastReceiver:參數為接收器與過濾器
- MainActivity.this.registerReceiver(receiver, filter);
-
- }
- });
- }
-
- //聲明廣播接收類,重寫onReceive()方法用於獲取手機當前電量
- public class BroadcastReceiverUtil extends BroadcastReceiver{
- @Override
- public void onReceive(Context context,Intent intent){
- String batteryInfo="";
- int rawlevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); //獲得當前電量
- int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); //獲得總電量
- int level = -1;
- if (rawlevel >= 0 && scale > 0) {
- level = (rawlevel * 100) / scale;
- }
- batteryInfo="當前電量: " + String.valueOf(level) + "%";
- Toast.makeText(context, batteryInfo, Toast.LENGTH_SHORT).show();
- }
- }
-
- @Override
- public void onStop(){
- super.unregisterReceiver(receiver);
- super.onStop();
- }
- }
本案例中,廣播發送方是Android系統本身,它會每隔若干毫秒發送一個當前電量的廣播信息。我們僅定義了接收方與過濾器,registerReceiver()作用是告訴接收器僅“聽”(處理)與過濾器(本例自然是ACTION_BATTERY_CHANGED)有關的信息。
三、配置文件
AndroidManifest.xml采用默認即可,無需另行配置。
四、運行結果
你會發現,每隔一段時間,都會使用Toast自動給我們顯示一下當前電量,也能驗證廣播是不斷發送的。如果我們的應用程序不定義廣播接收方,對這些信息都是“聽”而不見的。