iT邦幫忙

0

android broadcast

  • 分享至 

  • xImage
  •  

Broadcast 是廣播接收器 可以被動接收其他應用程式/狀態等等
主要需要 IntentFilter 過濾/增加intent 跟一個Reciever接收
分為靜態註冊 跟 動態註冊

靜態註冊 >mainefest.xml +
動態註冊 >程序要打開才可以接收廣播 並可以自由控制註冊跟取消
動態註冊

//要先引用註冊器 

private CustomReciever customReciever=new CustomReciever();
//Oncreate
//intent注入
 IntentFilter filter=new IntentFilter();
        filter.addAction(Intent.ACTION_POWER_CONNECTED);
        filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
 //註冊     
 this.registerReceiver(customReciever,filter);
 
 -------------------------
 OnDestroy
   this.unregisterReceiver(customReciever);
   
 --------------------------------
 註冊器
 new>Other>broadcastreciever
 //OnRecieve
 public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        String intentAct=intent.getAction();
        if (intentAct !=null){
            String toast="test";
            switch (intentAct){
                case Intent.ACTION_POWER_CONNECTED:
                    toast="connected";
                    break;
                case Intent.ACTION_POWER_DISCONNECTED:
                    toast="unconnected";
                    break;
                case "com.example.Broadcast.ACTION_CUSTOM_BROADCAST":
                    toast="custom";
                    break;
            }
            Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
        }
 

靜態註冊+本地廣播
本地廣播原理:https://blog.csdn.net/u010687392/article/details/49744579

//OnCreate
    LocalBroadcastManager.getInstance(this).registerReceiver(         customReciever,newIntentFilter("com.example.Broadcast.ACTION_CUSTOM_BROADCAST"));
 //OnDestroy    
 
 LocalBroadcastManager.getInstance(this).unregisterReceiver(customReciever);
 //多一個send
     public void sendCustomBroadcast(View view) {
        Intent custom=new Intent("com.example.Broadcast.ACTION_CUSTOM_BROADCAST");
        LocalBroadcastManager.getInstance(this).sendBroadcast(custom);
    }
 //manifest.xml
   <receiver
            android:name=".CustomReciever"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.Broadcast.ACTION_CUSTOM_BROADCAST"/>
            </intent-filter>
        </receiver>

普通廣播是異步的。正常廣播的接收者通常會同時以不確定的順序運行。要發送常規廣播,請創建廣播意圖並將其傳遞給sendBroadcast(Intent)
本地廣播被發送到與發送者在同一應用中的接收者 較為安全。要發送本地廣播,請創建廣播意圖並將其傳遞給LocalBroadcastManager.sendBroadcast
有序廣播一次傳送到一個接收機。當每個接收器執行時,它可以將結果傳播到下一個接收器,或者可以取消廣播,以使廣播不會傳遞到其他接收器。要發送有序廣播,請創建廣播意圖並將其傳遞給sendOrderedBroadcast(Intent, String)

normal broadcast 所有人都會同時收到訊息 不分先後順序
order broadcast 有先後順序 故可以阻斷
動態註冊要打開程序才能接收到廣播(可以自由控制註冊與取消)
創一個類繼承broadcast 並重寫class中的onRecieve方法

   private IntentFilter intentFilter;
   private NetworkChangeReciever networkChangeReciever; // 繼承broadcast
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.broadcast.LOCAL_BROADCAST"); //網路狀態改變
        networkChangeReciever = new NetworkChangeReciever();
        registerReceiver(networkChangeReciever,intentFilter);
        Button button=(Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               Intent intent=new Intent(
                       "com.example.broadcast.MY_BROADCAST"
                );
             sendBroadcast(intent);
            }
        });
       //      動態註冊廣播一定要取消註冊
        protected  void onDestroy(){
        super.onDestroy();
        unregisterReceiver(networkChangeReciever);
    }
       class NetworkChangeReciever extends BroadcastReceiver {
//        @Override
//        //繼承方法 網路發生變化
//        public void onReceive(Context context, Intent intent){
//            ConnectivityManager connectionManager= (ConnectivityManager)
//                    getSystemService(Context.CONNECTIVITY_SERVICE); 
                // 服務類專門看網路的
//            NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
//            if (networkInfo != null && networkInfo.isAvailable()) {
//                Toast.makeText(context, "network is available",
//                        Toast.LENGTH_SHORT).show();
//            } else {
//                Toast.makeText(context, "network is unavailable",
//                        Toast.LENGTH_SHORT).show();
//            }

然後記得拿權限 在manifest.xml中加入
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

--
靜態註冊不用打開程序也能聽到廣播 在這裡我們透過這個原則實現開機廣播
創一個實例 BootCompleteReciever
但在manifest裡面要多註冊這步驟

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver
            android:name=".BootCompleteReceiver"
            android:enabled="true"
            android:exported="true"></receiver>

標籤
intent-filter
<action android:name="android.intent.ation.BOOT_COMPLETED"/>

自定義廣播
先新創一個

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Toast.makeText(context, "recieve in my",
                Toast.LENGTH_SHORT).show();
        abortBroadcast();
        // 截斷 後面收不到
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

manifest

<receiver
           android:name=".MyBroadcastReceiver"
           android:enabled="true"
           android:exported="true">
           <intent-filter android:priority="100"> //priority是先後順序
               <action android:name="com.example.broadcast.MY_BROADCAST"/>
           </intent-filter>
       </receiver>

測試有序廣播
開第二個專案

public class AnotherBroadcastReciever extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Toast.makeText(context,"recieved in b ",Toast.LENGTH_SHORT).show();
        throw new UnsupportedOperationException("Not yet implemented");
    }
}
        <receiver
            android:name=".AnotherBroadcastReciever"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.broadcast.MY_BROADCAST"/>
                //接第一支專案的action
            </intent-filter>
        </receiver>

mainactivity.java
下面測試本地廣播 本地廣播安全性比較高 不會被其他城市呼叫
就只是多個本地廣播監聽器而已

public class MainActivity extends AppCompatActivity {
   private IntentFilter intentFilter;
   private LocalReceiver localReceiver;
   private LocalBroadcastManager localBroadcastManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        localBroadcastManager= LocalBroadcastManager.getInstance(this);
        Button button=(Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
                Intent intent=new Intent("com.example.broadcast.LOCAL_BROADCAST"
                );
                localBroadcastManager.sendBroadcast(intent);
                                      //sendOrderBroadcast(intent); 有先後順序
            }
        });
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.broadcast.LOCAL_BROADCAST");
        localReceiver =new  LocalReceiver();
        localBroadcastManager.registerReceiver(localReceiver,intentFilter);
    }
     class  LocalReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent){
                Toast.makeText(context, "yes",
                        Toast.LENGTH_SHORT).show();
              

    }

重要提示:儘管意圖既用於發送廣播,也用於通過發起活動startActivity(Intent),但這些動作是完全無關的。廣播接收者無法看到或捕獲Intent用於啟動活動的。同樣,播放時Intent,您不能使用它Intent來查找或開始活動。
廣播接收器是Android應用程序的基本組件。
廣播接收器可以接收系統或應用發送的廣播。
將Intent在廣播機構使用的是用於啟動活動的意圖完全不同。
要處理Intent與廣播關聯的傳入消息,請對BroadcastReceiver類進行子類化並實現onReceive()。
您可以在Android清單文件中或以編程方式註冊廣播接收器。
本地廣播是您的應用私有的。要註冊和發送本地廣播,請使用LocalBroadcastManager。本地廣播不涉及進程間通信,這使它們高效。使用本地廣播還可以保護您的應用程序免受某些安全問題的影響,因為數據保留在您的應用程序內部。
要Intent為廣播創建唯一的動作名稱,通常的做法是在動作名稱之前添加程序包名稱。
如果您的應用定位到API級別26或更高級別,則不能使用清單為大多數隱式廣播聲明接收方。(隱式廣播(包括大多數係統廣播)是不針對您的應用的廣播。)少數隱式廣播是例外。但是,您可以使用動態接收器來接收所有廣播。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言