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>