17_Android中Broadcast详解(有序广播,无序广播)最终广播,Bundle传递参数,传递参数的时候指定权限
1? Broadcast是Android中的四大組件之一,他的用途很大,比如系統的一些廣播:電量低、開機、鎖屏等一些操作都會發送一個廣播。
2? 廣播被分為兩種不同的類型:“普通廣播(Normalbroadcasts)”和“有序廣播(Ordered broadcasts)”.普通廣播是完全異步的,可以在同一時刻(邏輯上)被所有廣播接收者接收到,消息傳遞的效率比較高,但缺點是:接收者不能將處理結果傳遞給下一個接收者,并且無法終止廣播Intent的傳播;然后有序廣播是按照接收者聲明的優先級別(聲明在intent-filter元素的android:priority)屬性中,數越大優先級別越高,取值范圍:-1000到1000。也可以調用IntentFilter對象的setPriority()進行設置),被接收者依次接收廣播。如:A的級別高于B,B的級別高于C,那么,廣播先傳A,在傳給B,最后傳給C,A得到廣播后,可以往廣播里存入數據,當廣播傳給B時,B可以從廣播中得到A存入的數據。
?
Context.sendBroadcast()
發送的是普通廣播,所有訂閱者都有機會獲得并進行處理。
Context.sendOrderedBroadcast()
發送的是有序廣播,系統會根據接收者聲明的優先級按順序逐個執行接收者,前面的接收者有權終止廣播(通過調用BroadcastReceiver.abortBroadcast()),如果廣播被前面的接收者終止,后面的接收者就再也無法獲取到廣播。對于有序廣播,前面的接收者可以將處理結果存進廣播Intent,然后傳給下一個接收者。
?
編寫以下案例:
3 編寫Android清單文件
| <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ??? package="com.itheima.broadcasttest" ??? android:versionCode="1" ??? android:versionName="1.0" > ? ??? <uses-sdk ??????? android:minSdkVersion="8" ??????? android:targetSdkVersion="19" /> ? ??? <application ??????? android:allowBackup="true" ??????? android:icon="@drawable/ic_launcher" ??????? android:label="@string/app_name" ??????? android:theme="@style/AppTheme" > ??????? <activity ??????????? android:name="com.itheima.broadcasttest.MainActivity" ??????????? android:label="@string/app_name" > ??????????? <intent-filter> ??????????????? <action android:name="android.intent.action.MAIN" /> ? ??????????????? <category android:name="android.intent.category.LAUNCHER" /> ??????????? </intent-filter> ??????? </activity> ??????? ??????? <receiver android:name="com.itheima.broadcasttest.Level1Receiver" > ??????????? <intent-filter android:priority="1000" > ??????????????? <action android:name="com.itheima.broadcasttest.songwennuan" /> ??????????? </intent-filter> ??????? </receiver> ??????? <receiver android:name="com.itheima.broadcasttest.Level2Receiver" > ??????????? <intent-filter android:priority="500" > ??????????????? <action android:name="com.itheima.broadcasttest.songwennuan" /> ??????????? </intent-filter> ??????? </receiver> ??????? <receiver android:name="com.itheima.broadcasttest.Level3Receiver" > ??????????? <intent-filter android:priority="100" > ??????????????? <action android:name="com.itheima.broadcasttest.songwennuan" /> ??????????? </intent-filter> ??????? </receiver> ??????? <receiver android:name="com.itheima.broadcasttest.FinalReceiver" > ??????????? <intent-filter android:priority="0" > ??????????????? <action android:name="com.itheima.broadcasttest.songwennuan" /> ??????????? </intent-filter> ??????? </receiver> ??? </application> ? </manifest> |
4 編寫布局文件activity_main.xml
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ??? xmlns:tools="http://schemas.android.com/tools" ??? android:orientation="vertical" ??? android:layout_width="match_parent" ??? android:layout_height="match_parent" ??? tools:context=".MainActivity" > ??? ??? <Button ??????? android:onClick="send1" ??????? android:layout_width="fill_parent" ??????? android:layout_height="wrap_content" ??????? android:text="發送無序廣播" /> ? ??? <Button ??????? android:onClick="send2" ??????? android:layout_width="fill_parent" ??????? android:layout_height="wrap_content" ??????? android:text="發送有序廣播" /> ??? </LinearLayout> |
5 編寫一下廣播接收者
Level1Receiver
| package com.itheima.broadcasttest; ? import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; ? public class Level1Receiver extends BroadcastReceiver { ???????? private static final String TAG = "Broadcasttest"; ???????? ???????? @Override ???????? public void onReceive(Context context, Intent intent) { ?????????????????? String message = getResultData(); ?????????????????? Log.i(TAG,"省級部門得到中央的消息:" + message); ?????????????????? abortBroadcast();? //這里是終止了消息,可以關閉或者取消這里查看LogCat中打印的效果。 ?????????????????? setResultData("給農民兄弟發5000塊錢"); ???????? } ? } |
Level2Receiver
| package com.itheima.broadcasttest; ? import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; ? public class Level2Receiver extends BroadcastReceiver { ???????? private static final String TAG = "Broadcasttest"; ???????? ???????? @Override ???????? public void onReceive(Context context, Intent intent) { ?????????????????? String message = getResultData(); ?????????????????? Log.i(TAG,"市級部門得到省級的消息"? + message); ?????????????????? setResultData("給農民兄弟發2000塊錢"); ???????? } ? } |
Level3Receiver
| package com.itheima.broadcasttest; ? import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; ? public class Level3Receiver extends BroadcastReceiver { ???????? private static final String TAG = "Broadcasttest"; ???????? ???????? @Override ???????? public void onReceive(Context context, Intent intent) { ?????????????????? String message = getResultData(); ?????????????????? Log.i(TAG, "鄉級部門得到市的消息:" + message); ?????????????????? setResultData("給農民兄弟發兩大大米"); ???????? } ? } |
FinalReceiver
| package com.itheima.broadcasttest; ? import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; ? public class FinalReceiver extends BroadcastReceiver { ???????? private static final String TAG = "Broadcasttest"; ???????? ???????? @Override ???????? public void onReceive(Context context, Intent intent) { ?????????????????? String message = getResultData(); ?????????????????? Log.i(TAG, "農民兄弟得到鄉的消息:" + message); ???????? } } |
6 MainActivity的內容如下:
| package com.itheima.broadcasttest; ? import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.View; ? public class MainActivity extends ActionBarActivity { ? ???????? @Override ???????? protected void onCreate(Bundle savedInstanceState) { ?????????????????? super.onCreate(savedInstanceState); ?????????????????? setContentView(R.layout.activity_main); ???????? } ? ???????? /** ???????? ?* 發送無序廣播 ???????? ?* @param view ???????? ?*/ ???????? public void send1(View view) { ?????????????????? Intent intent = new Intent(); ?????????????????? intent.setAction("com.itheima.broadcasttest.songwennuan"); ?????????????????? intent.putExtra("msg", "發1萬塊"); ?????????????????? //無序廣播,不可被攔截,不可終止 ?????????????????? sendBroadcast(intent); ???????? } ???????? ???????? public void send2(View view) { ?????????????????? Intent intent = new Intent(); ?????????????????? intent.setAction("com.itheima.broadcasttest.songwennuan"); ?????????????????? //有序廣播,可被攔截,可終止,可以修改數據 ?????????????????? sendOrderedBroadcast(intent, null,new FinalReceiver(),null,0,"給農民兄弟發10000塊錢",null); ???????? } } |
運行:
點擊”發送無序廣播”按鈕,在LogCat中打印出的內容如下:
點擊” 發送有序廣播”按鈕,在LogCat中打印出的內容如下:
之所以在Level1Receiver執行了abortBroadcast()后還顯示下面一條,是因為指定了之中廣播:
| //有序廣播,可被攔截,可終止,可以修改數據 sendOrderedBroadcast(intent, null,new FinalReceiver(),null,0,"給農民兄弟發10000塊錢",null); |
若把Level1Receiver改成如下時:
| package com.itheima.broadcasttest; ? import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; ? public class Level1Receiver extends BroadcastReceiver { ???????? private static final String TAG = "Broadcasttest"; ???????? ???????? @Override ???????? public void onReceive(Context context, Intent intent) { ?????????????????? String message = getResultData(); ?????????????????? Log.i(TAG,"省級部門得到中央的消息:" + message); ?????????????????? //abortBroadcast();? //這里是終止了消息,可以關閉或者取消這里查看LogCat中打印的效果。 ?????????????????? setResultData("給農民兄弟發5000塊錢"); ???????? } } |
點擊”發送有序廣播”后顯示的內容如下:
==========================================================================
關于有序廣播的另外的一個案例:
1、編寫第一個廣播MyOrderBroadcastReciver
| package com.demoorderbroadcast; ? import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; ? public class MyOrderBroadcastReciver extends BroadcastReceiver { ? ???????? private static final String TAG = "BroadCast"; ???????? ???????? @Override ???????? public void onReceive(Context context, Intent intent) { ?????????????????? String strMsg = intent.getStringExtra("msg"); ?????????????????? Log.i(TAG, "第一個:" + strMsg); ?????????????????? //通過Bundle傳遞參數 ?????????????????? Bundle extras = new Bundle(); ?????????????????? extras.putString("msg", "第一個界面傳過來的" + strMsg); ?????????????????? setResultExtras(extras);//繼續向下傳 ???????? } } |
2 編寫第二個廣播MyOrderBroadcastReciverTwo
| package com.demoorderbroadcast; ? import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; ? public class MyOrderBroadcastReciverTwo extends BroadcastReceiver { ? ???????? private static final String TAG = "BroadCast"; ???????? ???????? @Override ???????? public void onReceive(Context context, Intent intent) { ?????????????????? //abortBroadcast();? //開啟此處,可以截斷廣播,不讓它傳到third中 ?????????????????? String strMsg = intent.getStringExtra("msg");?? //獲取廣播的原始數據 ?????????????????? ?????????????????? Log.i(TAG, "第二個界面傳過來的" + strMsg); ?????????????????? Bundle extras = new Bundle(); ?????????????????? extras.putString("msg", "第二個界面傳過來的" + strMsg); ?????????????????? setResultExtras(extras); //繼續向下傳 ?????????????????? ?????????????????? //"第二個:"+strMsg這是two中新的數據,傳遞到third中, ?????????????????? //在third中是用getResultData來獲得setResultData("")中的數據 ?????????????????? setResultData("第二個:" + strMsg); ???????? } ???????? } |
3 編寫第三個廣播MyOrderBroadcastReciverThird
| package com.demoorderbroadcast; ? import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; ? public class MyOrderBroadcastReciverThird extends BroadcastReceiver { ??? private static final String TAG = "BroadCast"; ??? ??? @Override ??? public void onReceive(Context context, Intent intent) { ?????? //獲得two中setResultData中的數據 ?????? String resultData = getResultData(); ?????? //獲取two中setResultExtras中的數據 ?????? Bundle bundle = getResultExtras(true); ?????? //獲取廣播的原始數據 ?????? String bundleData = bundle.getString("msg"); ?????? ?????? //獲取廣播的原始數據 ?????? String strMsg = intent.getStringExtra("msg"); ?????? Log.i(TAG, "第三個:" + strMsg); ?????? ?????? Log.i(TAG,"two中傳遞到third新的數據:" + resultData); ?????? Log.i(TAG, "two中setResultExtras(extras)傳到third新的數據:" + bundleData); ??? } } |
4 編寫MainActivity,代碼如下:
| package com.demoorderbroadcast; ? import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; ? public class MainActivity extends Activity { ? ???????? private Button btnSendOrderBroadCast; ???????? ???????? protected void onCreate(Bundle savedInstanceState) { ?????????????????? super.onCreate(savedInstanceState); ?????????????????? setContentView(R.layout.activity_main); ?????????????????? initView(); ???????? } ???????? ???????? private void initView() { ?????????????????? btnSendOrderBroadCast = (Button) this.findViewById(R.id.btn); ?????????????????? btnSendOrderBroadCast.setOnClickListener(new MyOnclickListener()); ???????? } ? ???????? private class MyOnclickListener implements OnClickListener { ? ?????????????????? public void onClick(View v) { ??????????????????????????? if (btnSendOrderBroadCast==v) { ???????????????????????????????????? sendOrderBroadCast(); ??????????????????????????? } ?????????????????? } ???????? } ? ???????? public void sendOrderBroadCast() { ?????????????????? Intent intent = new Intent("com.pzf.mybroadcast"); ?????????????????? intent.putExtra("msg", "toto ni hao"); ?????????????????? sendOrderedBroadcast(intent, "com.pzf.permission"); ???????? } } |
5 編寫Android的清單文件AndroidManifest.xml
| <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ??? package="com.demoorderbroadcast" ??? android:versionCode="1" ??? android:versionName="1.0" > ? ??? <uses-sdk ??????? android:minSdkVersion="8" ??????? android:targetSdkVersion="19" /> ??? <permission android:name="com.pzf.permission" android:protectionLevel="normal"></permission> ??? <uses-permission android:name="com.pzf.permission"/> ??? ??? <application ??????? android:allowBackup="true" ??????? android:icon="@drawable/ic_launcher" ??????? android:label="@string/app_name" ??????? android:theme="@style/AppTheme" > ??????? <activity ??????????? android:name="com.demoorderbroadcast.MainActivity" ??????????? android:label="@string/app_name" > ??????????? <intent-filter> ??????????????? <action android:name="android.intent.action.MAIN" /> ? ??????????????? <category android:name="android.intent.category.LAUNCHER" /> ??????????? </intent-filter> ??????? </activity> ??????? <receiver android:name="com.demoorderbroadcast.MyOrderBroadcastReciver"> ??????????? <intent-filter android:priority="1000"> ??????????????? <action android:name="com.pzf.mybroadcast"></action> ??????????? </intent-filter> ??????? </receiver> ??????? <receiver android:name="com.demoorderbroadcast.MyOrderBroadcastReciverTwo"> ??????????? <intent-filter android:priority="900"> ??????????????? <action android:name="com.pzf.mybroadcast"></action> ??????????? </intent-filter> ??????? </receiver> ??????? <receiver android:name="com.demoorderbroadcast.MyOrderBroadcastReciverThird"> ??????????? <intent-filter android:priority="800"> ??????????????? <action android:name="com.pzf.mybroadcast"></action> ??????????? </intent-filter> ??????? </receiver> ??? </application> </manifest> |
當點擊“發送有序廣播”時,LogCat中打印的內容如下:
?
總結
以上是生活随笔為你收集整理的17_Android中Broadcast详解(有序广播,无序广播)最终广播,Bundle传递参数,传递参数的时候指定权限的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么公司可以开商业承兑汇票
- 下一篇: 建行钱包有什么用