實驗內容
1.創建一個應用程序,點擊按鈕實現發送廣播。收到廣播后在logcat中顯示“智能終端開發課程在學銀在線開課啦”。運行效果如圖所示
2.創建三個廣播接收者1、2、3,並在注冊時設置廣播接收者的優先級,實現有序廣播,要求按照3、2、1的順序接受廣播消息,在logcat中按接受順序顯示廣播接收者的名稱。(自行編寫發送有序廣播信息的界面,可以與第一問的界面風格相同)
BroadcastReceiver廣播接收者是Android四大組件之一。一般的都要在AndroidManifest中靜態注冊,但是只有廣播接收者可以使用java代碼的方法來動態注冊。
BroadcastReceiver是用於接收廣播的組件用於組件與組件之間進行通信,可以跨應用程序傳遞.如操作系統電池電量低會發送一個廣播,這樣我們的程序里面可以去監聽這個廣播,可以關 閉程序里面比較耗電的功能,提示用戶注意保存進度什么的,還如其它安裝新應用等,還有普通應 用程序,例如啟動特定線程,文件下載完畢等。
Android中的廣播機制設計的非常出色,很多事情原本需要開發者親自操作的,現在只需等待廣播告知自己就可以了,大大減少了開發的工作量和開發周期。
廣播的發送的一般應用場合:發送頻率低的情況可以使用,數據量小的情況可以使用。
(一)BroadcastReceiver創建
要創建自己的BroadcastReceiver對象,我們需要繼承BroadcastReceiver類,並實現其onReceive 方法。 在onReceive方法內,我們可以獲取隨廣播而來的Intent中的數據,這非常重要,就像無線電一樣,包含很多有用的信息。 在創建完我們的BroadcastReceiver之后,還不能夠使它進入工作狀態,我們需要為它注冊一個指定的廣播地址。沒有注冊廣播地址的BroadcastReceiver就像一個缺少選台按鈕的收音機,雖然功能俱備,但也無法收到電台的信號。所以創建類后就要對BroadcastReceiver進行注冊。
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class MyReceiver4 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO: This method is called when the BroadcastReceiver is receiving // an Intent broadcast. throw new UnsupportedOperationException("Not yet implemented"); } }
(二)BroadcastReceiver注冊
1.靜態注冊
靜態注冊是在AndroidManifest.xml文件中配置的
<receiver android:name=".MyReceiver"> <intent-filter> <action android:name="android.intent.action.MY_BROADCAST" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver>
2.動態注冊
動態注冊需要在代碼中動態的指定廣播地址並注冊
注意,registerReceiver是android.content.ContextWrapper類中的方法,Activity 和Service都繼承了ContextWrapper,所以可以直接調用。 在實際應用中,我們在 Activity或Service中注冊了一個BroadcastReceiver,當這個Activity或Service被銷毀時 如果沒有解除注冊,系統會報一個異常,提示我們是否忘記解除注冊了。所以,記得在 特定的地方執行解除注冊操作。
MyBroadcastReceiver mbcr = new MyBroadcastReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(MyBroadcastReceiver.MY_BC_FIRST); registerReceiver(mbcr, filter);// 注冊 (2)解除注冊代碼,一般在頁面銷毀時操作 @Override protected void onDestroy() { unregisterReceiver(mbcr); mbcr = null; super.onDestroy(); }
通過上面兩步其實已經完成了一個簡單功能的廣播接收者,已經可以具有接受廣播功能了。在onReceive方法里面就可以做自己想要的處理。
但是上面的BroadcastReceiver注冊時的action動作意圖值是自己定義的字符串,需要自己發送對應意圖的廣播才能讓上面的廣播接收到消息,如果是上面使用系統定義好的動作意圖action,那么,就可以接收到系統發過來的廣播信息,比如手機接收到短信,手機底層是會發送一條廣播,查看手機系統內是否有符合條件的廣播接收者,如果有就會向它發送信息。。。
靜態注冊的廣播的程序運行一次后,以后能一直保持廣播接收的狀態,只要有對應的廣播就能接收它的廣播信息。而動態注冊的廣播需要程序在運行中才能接收廣播。
關於優先級的說明:
<intent-filter android:priority="999">
上面的內容是參考Android廣播接收者使用總結dhttps://blog.csdn.net/pingping_010/article/details/d80662198
然后就來寫代碼
不用寫動態的,只要靜態的就可以完成。然還需要建立三個廣播接收者
建的過程:右鍵->new->other->Broadcast
系統自動在AndroidManifest.xml中創建receiver,創建intent-filter實現action android:name
發送,接收廣播
第一步:創建三個廣播接收者和發送廣播
發送廣播
public class MainActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.homework_10);
button = (Button) findViewById(R.id.button40);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//發送廣播使用sendBroadcast,需要指定Intent的action來說明發送什么樣的廣播。
//Intent里面的參數是action,要和靜態注冊的廣播的actin對應//Toast.makeText(MainActivity.this,"廣播已發送--2---!!!",Toast.LENGTH_SHORT).show();
Intent intent = new Intent("myBroadcastReceiver");
intent.putExtra("msg", "小葵花媽媽智能終端開發課程在學銀在線開課啦!!!孩子學習老不好,打一頓就好了!!!");
intent.setPackage(getPackageName());//8.0以上系統必須加這條,否則無法接收到
sendOrderedBroadcast(intent,null);//如果是該自定義的廣播接收者發送廣播,第二個參數一般為null
Toast.makeText(MainActivity.this,"廣播已發送!!!",Toast.LENGTH_SHORT).show();
}
});
}
}
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.e("Receiver", "這是靜態的廣播接受者(優先級500)---》" + intent.getStringExtra("msg")); Toast.makeText(context, "這是使用靜態的方法來創建的廣播(優先級500)接受者收到消息", Toast.LENGTH_SHORT).show(); LogUtils.e("這是使用靜態的方法來創建的廣播(優先級500)接受者收到消息"); //abortBroadcast(); } }
public class MyReceiver2 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.e("Receiver", "這是靜態的廣播接受者(優先級999)---》" + intent.getStringExtra("msg")); Toast.makeText(context, "這是使用靜態的方法來創建的廣播接受者(優先級999)收到消息", Toast.LENGTH_SHORT).show(); LogUtils.e("這是使用靜態的方法來創建的廣播(優先級999)接受者收到消息"); //abortBroadcast(); } }
public class MyReceiver3 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.e("Receiver", "這是靜態的廣播接受者(優先級1111)---》" + intent.getStringExtra("msg")); Toast.makeText(context, "這是使用靜態的方法來創建的廣播接受者(優先級1111)收到消息", Toast.LENGTH_SHORT).show(); LogUtils.e("這是使用靜態的方法來創建的廣播(優先級1111)接受者收到消息"); //abortBroadcast(); } }
LogUtils是我自己以前寫的一個日志類,這里用不用都不影響
public class LogUtils { private final static boolean all = true; private final static boolean e = true; private final static String defaultTag = "Activet"; public static void e(String msg) { if (all && e) { try { android.util.Log.e(defaultTag, msg); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } /** * err Log print * * @param tag * :print tag * @param msg * :print message */ public static void E(String tag, String msg) { if (all && e) { android.util.Log.e(tag, msg); } } }
運行結果:
關於廣播接收者先暫時寫這么多吧,后續再補上相關的其他知識點!
加油,未來可期!!!
補一下xml文件,忘了,嘿嘿
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@mipmap/loading"> <Button android:id="@+id/button40" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="發送廣播信息" /> </LinearLayout>