廣播是一種廣泛運用在應用程序之間傳輸信息的機制,android中的廣播用於監聽系統事件或應用程序事件!android中的廣播包括普通廣播、有序廣播以及異步廣播(粘性廣播)!
廣播又有常駐型廣播和非常駐型廣播,常駐型廣播是在xml中進行註冊的,當應用程序關閉後,如果有對應的廣播發送過來,廣播接收器還是能夠被激活;非常駐型廣播是在代碼中進行註冊的,當應用程序關閉,廣播也就取消了,我們可以在Activity中的onCreate或者onResume方法中註冊廣播,然後在onDestory或者onPause方法中取消註冊廣播;
注意:如果是非常駐型廣播,應用程序關閉後,必須取消註冊廣播,否則會拋出異常!!
普通廣播的發送
普通廣播的發送使用方式:
sendBroadcast(Intent intent):intent表示意圖,所有匹配該廣播的意圖都能收到該廣播信息
sendBroadcast(intent, String receiverPermission);intent與上面一樣,receiverPermission表示權限,與之匹配權限的廣播才能接收到相應的廣播,如果爲null,表示不經許可的要求!
發送者: MainActivity.java頁面
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();
//發送廣播
//兩種類型的廣播 ——1.有序廣播 2.無序廣播
Intent intent=new Intent();
//指定廣播的名字(不能隨便寫,它要用包名,點後面的可以隨便寫)
intent.setAction("com.zking.administrator.g160628_android21_sender.hui");
//指定廣播內容
intent.putExtra("content",content);
// sendBroadcast(intent);//發送無序廣播
//發送無序黏性廣播 (發送黏性廣播必須寫權限)
//黏性廣播:退出程序再打開就能接收到,就跟QQ的離線消息一樣,發是可以發,當你一上線就能接收到
// sendStickyBroadcast(intent);
//發送有序廣播
sendOrderedBroadcast(intent,null);
}
}
AndroidManifest.xml(如果你要使用黏性廣播就必須寫權限)
<!--黏性廣播權限-->
<uses-permission android:name="android.permission.BROADCAST_STICKY"></uses-permission>
activity_main.xml頁面
<?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.zking.administrator.g160628_android21_sender.MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_main_content"
android:hint="請輸入要發送的內容"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="發送"
android:onClick="send"/>
</LinearLayout>
接收者1:MainActivity.java頁面(這個是使用代碼的動態廣播註冊)
package com.zking.administrator.g160628_android21_receiver01;
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.zking.administrator.g160628_android21_sender.hui");
//動態優先級在Java代碼中設置(有序)
intentFilter.setPriority(998);
}
//都是靜態時誰先安裝就水先運行,如果有一個是動態有一個是靜態的話,動態的優先級要比靜態的優先級高
//靜態廣播退出應用程序依然能接收到內容,動態廣播退出應用程序就接收不到
@Override
protected void onResume() {
super.onResume();
//動態:註冊廣播
registerReceiver(myReceiver01,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消註冊,只要你註冊了你就必須取消知註冊,不然它會報一個錯誤說你沒有取消註冊
unregisterReceiver(myReceiver01);
}
}
MyReciver01.java頁面
package com.zking.administrator.g160628_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.
*/
public class MyReceiver01 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//獲取廣播的名字
String action=intent.getAction();
//判斷,如果一樣就獲取廣播的內容
if("com.zking.administrator.g160628_android21_sender.hui".equals(action)){
//獲取廣播內容(無序廣播)
// String content=intent.getStringExtra("content");
//獲取結果(有序廣播)
Bundle bundle=getResultExtras(true);//是否能夠拿到,設置它爲true
String content=bundle.getString("newContent");
Log.i("test","廣播接收者1號"+content);
}
}
}
接收者2:配置頁面(這裏是在XML中)<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zking.administrator.g160628_android21_receiver02">
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--註冊:廣播接受者
動態註冊:使用Java代碼設置
靜態註冊:在XML文件重配置-->
<receiver android:name=".MyReceiver02">
<!--android:priority="有序廣播"取值範圍在-1000到1000中,取值越大優先級越高-->
<intent-filter
android:priority="1000">
<action android:name="com.zking.administrator.g160628_android21_sender.hui"></action>
</intent-filter>
</receiver>
</application>
</manifest>
MyReceiver02.java頁面
package com.zking.administrator.g160628_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.
*/
public class MyReceiver02 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//獲取廣播的名字
String action=intent.getAction();
//判斷,如果一樣就獲取廣播的內容
if("com.zking.administrator.g160628_android21_sender.hui".equals(action)){
//獲取廣播內容
String content=intent.getStringExtra("content");
Log.i("test","廣播接收者2號"+content);
//判斷,廣播的內容是’呵呵‘就不往下傳不了,如果不是’呵呵‘就往下傳播
if(content.contains("呵呵")){
//不傳播
abortBroadcast();//阻止廣播繼續傳播,abortBroadcast必須寫在優先級高的裏面,如果寫在低級的就沒什麼價值了
}
//改變廣播的內容 ,設置結果
Bundle bundle=new Bundle();
bundle.putString("newContent",content+",開玩笑的!!!");
setResultExtras(bundle);
}
}
}