思維導圖:
廣播簡介:
在Android中,有一些操作完成以後,會發送廣播,比如說發出一條短信,或打出一個電話,如果某個程序接收了這個廣播,就會做相應的處理。這個廣播跟我們傳統意義中的電臺廣播有些相似之處。之所以叫做廣播,就是因爲它只負責“說”而不管你“聽不聽”,也就是不管你接收方如何處理。另外,廣播可以被不只一個應用程序所接收,當然也可能不被任何應用程序所接收。
廣播三要素:
Android廣播機制包含三個基本要素:廣播(Broadcast) - 用於發送廣播;廣播接收器(BroadcastReceiver) - 用於接收廣播;意圖內容(Intent)-用於保存廣播相關信息的媒介。Broadcast是一種廣泛運用的在應用程序之間傳輸信息的機制。而BroadcastReceiver是對發送出來的Broadcast進行過濾接受並響應的一類組件。
舉例:
廣播電臺與收音機之間的關係,廣播電臺它只負責發送消息,他不管到底有沒有人收,也不管有沒有收到,它只負責發送。而收音機只需要將頻率調成和廣播電臺一個頻道就可以接收到發送的消息。
無序廣播
自定義一個廣播發送者
寫一個界面
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.android21_sender.MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="請輸入發送的廣播"
android:id="@+id/editText"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="發送"
android:onClick="Send"
/>
</LinearLayout>
package com.example.android21_sender;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);//獲取輸入框控件
}
public void Send(View view){
String content=editText.getText().toString(); //獲取控件裏面的文本內容
//發送廣播
// 兩種類型廣播
Intent intent=new Intent();
//指定廣播的名字
intent.setAction("com.example.android21_sender.test");
//指定廣播的內容
intent.putExtra("content",content);
//發送無序廣播
//sendBroadcast(intent);
//發送黏性廣播
sendStickyBroadcast(intent);
}
}
注意:發送黏性廣播需要在AndroidManifest.xml添加權限
<!--黏性廣播權限-->
<uses-permission android:name="android.permission.BROADCAST_STICKY"></uses-permission>
廣播接收者01號(動態註冊01號)採取Java代碼設置
核心代碼:
接收者類
package com.example.android21_receiver01;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
/**
* Created by Administrator on 2017/7/11 0011.
*/
public class Receiver01 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//獲取廣播的名字
String action=intent.getAction();
if("com.example.android21_sender.test".equals(action)){
//獲取廣播內容
String content=intent.getStringExtra("content");
Log.i("test","廣播接受者1號:"+content);
}
}
}
註冊,Java代碼設置
package com.example.android21_receiver01;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
private Receiver01 myReceiver01;
private IntentFilter intentFilter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myReceiver01 = new Receiver01();
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.android21_sender.test"); //設置頻道
}
@Override
protected void onResume() {
super.onResume();
//註冊廣播
registerReceiver(myReceiver01,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消註冊 註銷
unregisterReceiver(myReceiver01);
}
}
廣播接收者02號(靜態註冊02號)採取XML配置方式
核心代碼:
package com.example.android21_receiver02;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
/**
* Created by Administrator on 2017/7/11 0011.
*/
public class Receiver02 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//獲取廣播的名字
String action=intent.getAction();
if("com.example.android21_sender.test".equals(action)){//判斷是否在同一頻道
//獲取廣播內容
String content=intent.getStringExtra("content");
Log.i("test","廣播接受者2號:"+content); //打印出接收到的消息
}
}
}
注意:需要在AndroidManifest.xml中配置receiver
<receiver android:name=".Receiver02">
<intent-filter>
<action android:name="com.example.android21_sender.test"></action>
</intent-filter>
</receiver>
總結(一):
①、如果同是靜態接收者,誰先安裝,誰就先收到廣播發送的消息。
②、靜態註冊和動態註冊,則動態註冊的優先級高,先收到消息。
③、靜態接收者無論是否運行程序都會接收消息
④、動態接收者,如果沒有運行則接收不到。當發送完畢再運行接收,就收不到消息。爲了解決這一個問題,就有了黏性廣播。黏性廣播事先接收了消息,但不進行任何操作,當你運行時才執行操作。
⑤、相同廣播,誰先安裝誰接收的消息越快
有序廣播
廣播發送者
發送界面與上面無需廣播一樣
核心代碼:
package com.zking.administrator.g160628_android21_sender;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
private EditText et_main_content;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_main_content = (EditText) findViewById(R.id.et_main_content);
}
public void send(View view){
String content=et_main_content.getText().toString();
//發送廣播
//兩種類型廣播
//有序廣播 無序廣播
Intent intent=new Intent();
//指定廣播的名字
intent.setAction("com.example.android21_sender.test");
//指定廣播內容
intent.putExtra("content",content);
//發送有序廣播
sendOrderedBroadcast(intent,null);
}
}
廣播接收者01號(動態註冊)
核心代碼:
註冊類
package com.example.android21_sender;
import android.content.IntentFilter;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity { private MyReceiver01 myReceiver01; private IntentFilter intentFilter; @Override protected void
onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myReceiver01 = new MyReceiver01(); intentFilter = new IntentFilter(); intentFilter.addAction("com.example.android21_sender.test");intentFilter.setPriority(998); //設置優先級 } @Override protected void onResume() { super.onResume(); //註冊廣播 registerReceiver(myReceiver01,intentFilter); } @Override protected void onDestroy() { super.onDestroy(); //取消註冊 註銷 unregisterReceiver(myReceiver01); }}
接收類
package com.example.android21_receiver01;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.util.Log;/** * Created by Administrator on 2017/7/11 0011. */public class MyReceiver01 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //獲取廣播的名字 String action=intent.getAction(); if("com.example.android21_sender.test".equals(action)){
//獲取結果 Bundle bundle=getResultExtras(true); String content=bundle.getString("newContent"); Log.i("test","廣播接受者1號:"+content); } }}
廣播接收者02號
核心代碼:
package com.example.android21_receiver02;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.util.Log;/** * Created by Administrator on 2017/7/11 0011. */public class MyReceiver02 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //獲取廣播的名字 String action=intent.getAction(); if("com.example.android21_sender.test".equals(action)){
//獲取廣播內容 String content=intent.getStringExtra("content"); Log.i("test","廣播接受者2號:"+content); //判斷 if(content.contains("免費")){ //當內容中含有免費字樣的時候不傳播了 abortBroadcast(); //停止向下傳播 } //改變廣播的內容 //設置結果 Bundle bundle=new Bundle(); bundle.putString("newContent",content+",開玩笑的,你闊以免費擁有小灰灰"); setResultExtras(bundle); } }}
XML配置
<receiver android:name=".MyReceiver02"><!--設置優先級-->
<intent-filter
android:priority="1000"
>
<action android:name="com.example.android21_sender.test"></action>
</intent-filter>
總結(二):
①有序廣播可以設置優先級,範圍是(1000 ~ -1000)整數類型,數字越大優先級越高,先得到消息
②有序廣播可禁止往下傳播
③有序廣播可以改變向下傳播的內容