android之廣播的實現


實驗內容

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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM