android BroadcastReceiver廣播使用詳解

BroadcastReceiver廣播有兩種發送的方式:

    1、普通廣播---接收方沒有先後順序
    2、有序廣播---接收方有先後順序,按照設置的順序接收廣播

BroadcastReceiver廣播有兩種註冊方式:

    1、靜態註冊----在清單文件中註冊
    2、動態註冊----在程序中註冊(動態註冊的廣播使用完一定要註銷)

1、靜態註冊 —-發送普通廣播

 * 1、創建一個BroadcastReceiver的子類,重寫onReceive()方法。
public class MyBroadcast2 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Toast.makeText(context, "廣播2", Toast.LENGTH_SHORT).show();
    }

}
 * 2、在清單文件中註冊廣播
     意圖過濾器的name屬性用於廣播接收的時候接收指定的廣播,和ID類似
        <!-- 註冊廣播 -->
        <receiver android:name=".MyBroadcast" >
            <intent-filter> <!-- 添加意圖過濾器 -->
                <action android:name="com.example.class_broadcastreceiver" />
            </intent-filter>
        </receiver>
 * 3、通過sendBroadcast(intent)發送廣播
    Intent intent = new Intent();
    intent.setAction("com.example.class_broadcastreceiver");
    sendBroadcast(intent);// 發送廣播

2、靜態註冊 —-發送有序廣播

步驟和發送普通廣播一樣,不同的是在清單文件中註冊廣播時添加一條屬性:android:priority=”11”設置的值越大先接收到廣播的優先級就越高。有序廣播高優先級的接收方可以通過在onReceive()中調用abortBroadcast()方法停止廣播的繼續傳播,在某一個接收方中調用該方法後,低優先級的接收方就不能接收到這條廣播。

  <receiver android:name=".MyBroadcast2" >
        <intent-filter android:priority="11" > <!-- 數值越大,越先接收廣播 -->
             <action android:name="abc" />
        </intent-filter>
  </receiver>

中斷廣播的傳播:

public class MyBroadcast extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        String name = intent.getStringExtra("name");
        System.out.println("---1->>" + name);
        abortBroadcast();// 終止當前廣播
    }
}

3、動態註冊 —-監聽android電量變化

1、創建BroadcastReceiver的子類並且重寫onReceive方法,在onReceive方法中可以進行一些接收到系統廣播的邏輯操作,發送通知或者Toast但不建議彈出Dialog。
public class PowerBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) {
                int level = intent.getIntExtra("level", 0);
                int scale = intent.getIntExtra("sacle", 100);
                textView.setText("當前手機電量爲: " + (level * 100) / scale + "%");
            }
        }

    }
2、實例化BroadcastReceiver的子類,調用registerReceiver()方法註冊廣播。
receiver = new PowerBroadcastReceiver();
        // 意圖過濾器
        IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        // 註冊接收
        registerReceiver(receiver, filter);
3、註銷廣播,調用unregisterReceiver()方法註銷廣播
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);// 註銷廣播
    }
動態註冊的廣播不再需要在清單文件中進行註冊!監聽手機電量變化需要在清單文件中申請權限:
 <uses-permission android:name="android.permission.BATTERY_STATS"/>

4、靜態註冊 —-實現App的開機啓動

1、清單文件中添加系統啓動監聽權限
<!-- 監聽系統開機廣播權限 -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
2、清單文件中註冊廣播
 <!-- 註冊廣播 -->
        <receiver android:name=".BootCompleteReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.HOME" >
                </category>
            </intent-filter>
        </receiver>
3、創建BroadcastReceiver的子類並且重寫onReceive方法,在onReceive方法中啓動我們需要開機啓動的Activity
public class BootCompleteReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Intent intent2 = new Intent(context, MainActivity.class);
        intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent2);
    }
}

電量監控源碼:

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {
    private TextView textView;
    private PowerBroadcastReceiver receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) this.findViewById(R.id.textView1);
        receiver = new PowerBroadcastReceiver();
        // 意圖過濾器
        IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        // 註冊接收
        registerReceiver(receiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);// 註銷廣播
    }

    public class PowerBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) {
                int level = intent.getIntExtra("level", 0);
                int scale = intent.getIntExtra("sacle", 100);
                textView.setText("當前手機電量爲: " + (level * 100) / scale + "%");
            }
        }

    }
}
<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="141dp"
        android:text="TextView" />

</RelativeLayout>

鏈接:http://blog.csdn.net/q296264785/article/details/53445206

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章