首先介紹一下BroadCastRecieve有幾種: 1.無序廣播(普通廣播):sendBroadcast()方式 2.有序廣播:sendOrderedBroadcast()方式 3.粘性廣播:sendStickyBroadcast()方式 生命周期比較簡單: 下麵是無序廣播與有序廣播的區別: 下麵 ...
首先介紹一下BroadCastRecieve有幾種:
1.無序廣播(普通廣播):sendBroadcast()方式
2.有序廣播:sendOrderedBroadcast()方式
3.粘性廣播:sendStickyBroadcast()方式
生命周期比較簡單:
下麵是無序廣播與有序廣播的區別:
下麵是普通廣播(無序廣播,有序廣播)與粘性廣播的區別:
sendBroadcast(intent); 發送之前必須註冊廣播,否則無法接收到廣播信息。
sendStickyBroadcast(intent);發送廣播後,註冊也可收到廣播信息。
首先看下一個無序廣播,有序廣播的例子:
package com.example.demo_broadcast2; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { @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萬塊"); intent.putExtra("isUnordered", true); // 無序廣播,不可被攔截,不可終止 sendBroadcast(intent); } public void send2(View view) { Intent intent = new Intent(); intent.setAction("com.itheima.broadcasttest.songwennuan"); // 有序廣播,可被攔截,可終止,可以修改數據 sendOrderedBroadcast(intent, null, null, null, 0, "給農民兄弟發10000塊錢", null); } }
send1,send2分別為點擊事件觸發時調用的函數分別為發送無序廣播按鈕,發送有序廣播按鈕。
activity_main.xml文件
<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" tools:context=".MainActivity" > <Button android:onClick="send1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="發送無序廣播" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginTop="51dp" android:onClick="send2" android:text="發送有序廣播" /> </RelativeLayout>
下麵依次是多個廣播的實例(為了體現有序廣播)
package com.example.demo_broadcast2; 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) { boolean isUnordered = intent.getBooleanExtra("isUnordered", false); if (isUnordered) { String message = intent.getStringExtra("msg"); Log.i(TAG, "省級部門得到中央的消息:" + message); } else { String message = getResultData(); Log.i(TAG, "省級部門得到中央的消息:" + message); abortBroadcast(); // 這裡是終止了消息,可以關閉或者取消這裡查看LogCat中列印的效果。 setResultData("給農民兄弟發5000塊錢"); // setResultData()方法,就是為了在有序廣播中修改傳到下一個廣播中的值而存在的,且只能存儲一個String. } } }
package com.example.demo_broadcast2; 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) { boolean isUnordered = intent.getBooleanExtra("isUnordered", false); if (isUnordered) { String message = intent.getStringExtra("msg"); Log.i(TAG, "市級部門得到省級的消息" + message); } else { String message = getResultData(); Log.i(TAG, "市級部門得到省級的消息" + message); setResultData("給農民兄弟發2000塊錢"); } } }
package com.example.demo_broadcast2; 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) { boolean isUnordered = intent.getBooleanExtra("isUnordered", false); if (isUnordered) { String message = intent.getStringExtra("msg"); Log.i(TAG, "鄉級部門得到市的消息:" + message); } else { String message = getResultData(); Log.i(TAG, "鄉級部門得到市的消息:" + message); setResultData("給農民兄弟發兩大大米"); } } }
package com.example.demo_broadcast2; 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) { boolean isUnordered = intent.getBooleanExtra("isUnordered", false); if (isUnordered) { String message = intent.getStringExtra("msg"); Log.i(TAG, "農民兄弟得到鄉的消息:" + message); } else { String message = getResultData(); Log.i(TAG, "農民兄弟得到鄉的消息:" + message); } } }
首先我麽線設置一下logcat如下:
接下來我們看一下效果:
當我們點擊“發送無序廣播”的時候效果如下:
可見只要我們發送一個廣播,註冊此廣播的都會搜到相同的信息。
當我們點擊“發送有序廣播”的時候效果如下:
我們在Level1Receiver 中調用了一下方法截斷了消息傳輸到下一個廣播接收者。
abortBroadcast(); // 這裡是終止了消息
如果我們把下麵函數註釋掉。
//abortBroadcast();
可見效果每個接收者接收到的數據都不一樣這是因為我們通過一下函數向下發送了消息:
setResultData("給農民兄弟發2000塊錢");
可見這是有順序的,順序是由廣播接收者定義時可以設置優先順序。代碼可參考androidManifast.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.demo_broadcast2" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.demo_broadcast2.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=".Level1Receiver" > <intent-filter android:priority="1000" > <action android:name="com.itheima.broadcasttest.songwennuan" /> </intent-filter> </receiver> <receiver android:name=".Level2Receiver" > <intent-filter android:priority="500" > <action android:name="com.itheima.broadcasttest.songwennuan" /> </intent-filter> </receiver> <receiver android:name=".Level3Receiver" > <intent-filter android:priority="100" > <action android:name="com.itheima.broadcasttest.songwennuan" /> </intent-filter> </receiver> <receiver android:name=".FinalReceiver" > <intent-filter android:priority="-100" > <action android:name="com.itheima.broadcasttest.songwennuan" /> </intent-filter> </receiver> </application> </manifest>
還有一點我們要註意的是如果通過下麵方法中指定final接收者時:
sendOrderedBroadcast(intent, null, new finalReceiver(), null, 0,"給農民兄弟發10000塊錢", null);
同時調用 abortBroadcast(); // 這裡是終止了消息
此時的效果如下:
也就是說發送有序廣播時可以指定一個final接收者來充當無序廣播,即不管是中間截斷了消息傳遞只要定義了final接收者那麼久可以收到傳遞下來的消息。
接下來我麽看一下粘性廣播與普通廣播有什麼區別代碼如下:
package com.example.demo_stickybroadcast; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; /* * sendBroadcast(intent); 發送之前必須註冊廣播,否則無法接收到廣播信息。 * sendStickyBroadcast(intent);發送廣播後,註冊也可收到廣播信息。 */ public class MainActivity extends Activity { Button btnSendi; Button btnSends; Button btnStart; Context mContext; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnSendi = (Button) findViewById(R.id.broadcast); btnSends = (Button) findViewById(R.id.stickybroadcast); btnStart = (Button) findViewById(R.id.next_activity); mContext = getApplicationContext(); btnSendi.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(); intent.setAction("com.android.my.action"); //指定意圖Action mContext.sendBroadcast(intent); //普通廣播發送 } }); btnStart.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(MainActivity.this, ReceiverActivity.class); startActivity(intent); //跳轉到ReceiverActivity } }); btnSends.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(); intent.setAction("com.android.my.action.sticky");//指定意圖Action mContext.sendStickyBroadcast(intent);//sticky廣播發送 } }); } }
package com.example.demo_stickybroadcast; 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 ReceiverActivity extends Activity { private IntentFilter mIntentFilter; private TextView text; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); text = (TextView) findViewById(R.id.context); mIntentFilter = new IntentFilter(); //初始化intent過濾器 //添加action mIntentFilter.addAction("com.android.my.action"); mIntentFilter.addAction("com.android.my.action.sticky"); } private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); text.setText("action: " + action); } }; @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); registerReceiver(mReceiver, mIntentFilter); //註冊廣播 } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); unregisterReceiver(mReceiver); //註銷廣播 } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.demo_stickybroadcast" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.demo_stickybroadcast.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> <activity android:name="com.example.demo_stickybroadcast.ReceiverActivity" > </activity> </application> </manifest>
運行應用後可以操作一下步驟:
1.點擊“sendbroadcast”
2.點擊進入“StartAcitivity”
此時你會發現沒有顯示任何信息這說明,在ReceiverActivity中註冊的廣播沒有收到任何信息。
這是因為普通廣播發送以後即通過sendbroadcast() 或 sendOrderedbroadcast(),只有已經註冊相應的廣播的接受者可以接到信息,而後註冊此廣播的廣播接收者是無法接受到的。
也就是說要接收普通廣播發出的廣播時,需發送廣播之前先註冊相應的廣播。
而當你操作一下步驟時:
1.點擊“sendStickybroadcast”
2.點擊進入“StartAcitivity”
你會發現廣播發送出去以後註冊此廣播的廣播接收者是可以收到此消息的。