FMUSER更輕鬆地傳輸視頻和音頻!

[電子郵件保護] WhatsApp的+ 8618078869184
語言

    Android中廣播的詳細說明

     

    廣播分為兩種不同的類型:“普通廣播”和“有序廣播”。 普通廣播是完全異步的,並且可以被所有廣播接收器同時(在邏輯上)接收。 消息傳遞的效率較高,但是缺點是接收者無法將處理結果傳遞給下一個接收者,並且無法終止。 廣播意圖傳播; 但是,有序廣播基於接收者聲明的優先級(在intent-filter元素的android:priority屬性中聲明,數字越大,優先級越高,值範圍:-1000到1000。它也是可能調用IntentFilter對象的setPriority()進行設置),收件人依次接收廣播。 例如,如果A的級別高於B的級別,並且B的級別高於C的級別,則廣播首先傳輸到A,然後傳輸到B,最後傳輸到C。可以在廣播中存儲數據。 當廣播發送到B時,B可以從廣播中獲取A所存儲的數據。

     

    Context.sendBroadcast()

       發送的是普通廣播,所有訂戶都有機會獲取和處理該廣播。

     

    Context.sendOrderedBroadcast()

       發送是有序廣播。 系統將根據接收方聲明的優先級一一執行接收方。 先前的接收者有權終止廣播(BroadcastReceiver.abortBroadcast())。 如果廣播被前一個接收者終止,則後者將無法再接收廣播。 對於有序廣播,前一個接收器可以將處理結果存儲在廣播Intent中,然後將其傳遞給下一個接收器。

     
    廣播接收器(BroadcastReceiver)用於接收廣播Intent,並通過調用Context.sendBroadcast()和Context.sendOrderedBroadcast()來實現廣播Intent的發送。 通常,預訂此Intent的多個廣播接收器可以接收廣播Intent。 此功能類似於JMS中的主題消息接收器。 實現廣播接收器的方法如下:

     

    第一步:定義廣播接收器,繼承BroadcastReceiver,然後重寫onReceive()方法。

    公共類IncomingSMSReceiver extendedBroadcastReceiver {
      @Override public void onReceive(Contextcontext,Intentintent){
      }
    }

     

    步驟2:訂閱感興趣的廣播Intent,有兩種訂閱方法:

    第一種類型:使用代碼進行訂閱(動態訂閱)

    IntentFilter filter = newIntentFilter(“ android.provider.Telephony.SMS_RECEIVED”);
    IncomingSMSReceiver接收者= newIncomingSMSReceiver();
    registerReceiver(接收器,過濾器);

     

    第二種類型:訂閱AndroidManifest.xml文件中的節點(靜態訂閱)


      
           
      


    讓我們看一下動態廣播訂閱和靜態廣播訂閱之間的區別:
    靜態訂閱廣播也稱為:常駐廣播。 當您的應用程序關閉時,如果有廣播消息,您編寫的廣播接收器也可以接收它。 在您的應用程序中,其註冊方法為AndroidManifast。 .xml進行訂閱。

     

    動態訂閱廣播也稱為:非本地廣播。 當應用程序結束時,廣播自然會消失。 例如,您在活動的onCreate或onResume中訂閱廣播,並且必須在onDestory或onPause中取消廣播訂閱。 否則,將報告異常,因此您的廣播接收者將是非居民。

     

    此處有一個更多的詳細信息,即這兩種訂閱方法。 發送廣播時,您需要注意:隱式意圖方法用於動態註冊,因此在發送廣播時需要使用隱式意圖進行發送。 ,否則廣播接收器將無法接收廣播。 注意這一點。 但是當進行靜態訂閱時,由於它是在AndroidMainfest.xml中訂閱的,因此可以在發送廣播時使用display Intent和隱式Intent(當然,這僅適用於我們自己定義的廣播接收器),因此以防萬一,我們通常使用隱式意圖發送廣播。

     

    讓我們看一個例子:

    看一下項目結構:

     

    看一下靜態訂閱廣播:
    包com.broadcast.demo;

    導入android.app.Activity;
    導入android.content.Intent;
    導入android.os.Bundle;
    導入android.view.View;
    導入android.view.View.OnClickListener;
    導入android.widget.Button;

    導入com.example.androidbroadcastdemo.R;

    / **
     *靜態訂閱廣播
     * @作者weijiang204321
     *
     */
    公共類StaticRegisterBroadcastActivity擴展Activity {

    @覆蓋
    受保護的void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    按鈕btn =(Button)findViewById(R.id.btn);

    btn.setOnClickListener(new OnClickListener(){
    @覆蓋
    public void onClick(視圖v){
    //使用靜態方式註冊廣播,可以使用顯示意圖發送廣播
    意向廣播=新的Intent(“ com.broadcast.set.broadcast”);
    sendBroadcast(broadcast,null);
    }

    });
    }

    }


    在AndroidMainfest.xml中訂閱:



    <清單 xmlns:android="
    http://schemas.android.com/apk/res/android"
        package =“ com.example.androidbroadcastdemo”
        android:versionCode =“ 1”
        android:versionName =“ 1.0”>

        <使用-sdk
            android:minSdkVersion =“ 8”
            android:targetSdkVersion =“ 18” />
       
       
       
       
       
       

        <應用
            android:allowBackup =“ true”
            android:icon =“ @ drawable / ic_launcher”
            android:label =“ @ string / app_name”
            android:theme =“ @ style / AppTheme”>
            <活動
                android:name =“ com.broadcast.demo.StaticRegisterBroadcastActivity”
                android:label =“ @ string / app_name”>
               
                   
                   
               
           
           
           
           
               
                   
               
           
           
           
           
           
               
                   
               
           
           
           
           
               
                   
               
           
           
           
           
           
               
                   
               
           
           
       

    現在不用擔心其他內容,我們將在後面討論,這裡我們僅關注靜態廣播的註冊。


          
               
                   
               
           


    讓我們看一下廣播的接收者:

    包com.broadcast.receiver;

    導入android.content.BroadcastReceiver;
    導入android.content.Context;
    導入android.content.Intent;
    導入android.util.Log;

    / **
     *廣播接收器
     * @作者weijiang204321
     *
     */
    公共類UnSortBroadcastReceiver擴展了BroadcastReceiver {

    @覆蓋
    public void onReceive(Context context,Intent intent){
    Log.e(“ Intent_Action:”,intent.getAction()+“”);
    }

    }
    廣播接收器中onReceive方法中的邏輯非常簡單,即打印Action的內容。
    運行程序,結果很簡單,這裡沒有圖片。

     

    讓我們看一下動態訂閱:


    包com.broadcast.demo;

    導入android.app.Activity;
    導入android.content.Intent;
    導入android.content.IntentFilter;
    導入android.os.Bundle;
    導入android.view.View;
    導入android.view.View.OnClickListener;
    導入android.widget.Button;

    導入com.broadcast.receiver.UnSortBroadcastReceiver;
    導入com.example.androidbroadcastdemo.R;

    / **
     *使用動態方式註冊廣播
     * @作者weijiang204321
     *
     */
    公共類DynamicRegisterBroadcastActivity擴展了Activity {

    公共靜態最終字符串NEW_LIFEFORM_DETECTED =“ com.dxz.broadcasttest.NEW_LIFEFORM”;
    受保護的UnSortBroadcastReceiver接收器;

    @覆蓋
    受保護的void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    按鈕btn0 =(按鈕)findViewById(R.id.btn);
    btn0.setOnClickListener(new OnClickListener(){
    public void onClick(視圖v){
    //發送廣播
    意圖=新意圖(NEW_LIFEFORM_DETECTED);
    sendBroadcast(it);
    }
    });
    }

    @覆蓋
    受保護的void onResume(){
    super.onResume();
    //註冊播放
    IntentFilter counterActionFilter = new IntentFilter(NEW_LIFEFORM_DETECTED);
    接收器=新的UnSortBroadcastReceiver();
    registerReceiver(receiver,counterActionFilter);
    }

    @覆蓋
    受保護的void onPause(){
    super.onPause();
    //取消廣播
    unregisterReceiver(receiver);
    }
    }
    在這裡,我們訂閱onResume中的廣播,而取消訂閱onPause中的廣播。
    在AndroidMainfest.xml中將啟動的Activity更改為DynamicRegisterBroadcastActivity。 其他內容無需修改。 運行程序並打印結果非常簡單,所以我在這裡看不到圖片。

     

    讓我們看一下有序廣播和無序廣播

    我們一開始就已經提到了這一點,讓我們看一下無序廣播:

    首先,我們定義兩個廣播接收器:

    第一個廣播接收器:


    包com.broadcast.receiver;

    導入android.content.BroadcastReceiver;
    導入android.content.Context;
    導入android.content.Intent;
    導入android.util.Log;

    / **
     *廣播接收器A
     * @作者weijiang204321
     *
     */
    公共類SortBroadcastReceiverA擴展了BroadcastReceiver {

    @覆蓋
    public void onReceive(Context context,Intent intent){
    Log.e(“ Demo:”,“廣播接收器A”);
    }

    }
    第二個廣播接收器:

    包com.broadcast.receiver;

    導入android.content.BroadcastReceiver;
    導入android.content.Context;
    導入android.content.Intent;
    導入android.util.Log;

    / **
     *廣播接收器B
     * @作者weijiang204321
     *
     */
    公共類SortBroadcastReceiverB擴展了BroadcastReceiver {

    @覆蓋
    public void onReceive(Context context,Intent intent){
    Log.e(“ Demo:”,“ Broadcast B”);
    }



    }


    訂閱以在AndroidMainfest.xml中廣播


     
               
                   
               

           

               
                   
               

    操作結果:


    運行結果有點奇怪。 為什麼接收機B在前面,接收機A在後面? 原因是,當我們在AndroidMainfest.xml中訂閱廣播時,我們在intent-filter中設置了android:priority屬性值。 值越大,優先級越高。 ,接收方B的優先級為1000,接收方A的優先級為999,因此B先接收廣播,然後A接收廣播,但是接收方B與接收方A之間沒有連接,並且無法進行交互是,因為這是亂序的廣播並且是異步的,所以我們可以通過在B中的onReceiver方法中添加代碼來進行實驗:

    abortBroadcast(); //終止此廣播的傳輸

    操作結果:

     

    我們可以看到提示錯誤,即不允許無序廣播終止廣播。 實際上,終止是沒有用的,因為接收方A仍接收廣播。

     

    讓我們看一下有序廣播,需要修改代碼:

    首先是在發送廣播時:


    意向廣播=新的Intent(“ com.broadcast.set.broadcast”);
    sendOrderedBroadcast(broadcast,null);
    然後添加一種方法來終止B接收器中的廣播:
    abortBroadcast();

    其他代碼不需要修改,操作結果為:

     

    僅存在接收方B,接收方A不接收廣播,因為廣播在接收方B中終止,隨後的接收方無法接受。

    修改下面的代碼:

    收件人B:


    包com.broadcast.receiver;

    導入android.content.BroadcastReceiver;
    導入android.content.Context;
    導入android.content.Intent;
    導入android.os.Bundle;
    導入android.util.Log;

    / **
     *廣播接收器B
     * @作者weijiang204321
     *
     */
    公共類SortBroadcastReceiverB擴展了BroadcastReceiver {

    @覆蓋
    public void onReceive(Context context,Intent intent){
    Log.e(“ Demo:”,“廣播接收器B”);
    Bundle bundle = new Bundle();
    bundle.putString(“ next_receiver”,“下一個廣播接收器”);
    setResultExtras(bundle);
    }

    }
    B收到廣播後,它將存儲一些值並將其傳遞給下一個接收器。


    接收方A的代碼:


    包com.broadcast.receive

     

     

     

     

    列出所有問題

    暱稱

    電子郵件

    問題

    我們的其他產品:

    專業調頻電台設備包

     



     

    酒店IPTV解決方案

     


      輸入電子郵件以獲取驚喜

      fmuser.org

      es.fmuser.org
      it.fmuser.org
      fr.fmuser.org
      de.fmuser.org
      af.fmuser.org ->荷蘭語
      sq.fmuser.org ->阿爾巴尼亞人
      ar.fmuser.org ->阿拉伯語
      hy.fmuser.org - >亞美尼亞
      az.fmuser.org ->阿塞拜疆
      eu.fmuser.org ->巴斯克
      be.fmuser.org ->白俄羅斯語
      bg.fmuser.org - >保加利亞
      ca.fmuser.org ->加泰羅尼亞語
      zh-CN.fmuser.org ->中文(簡體)
      zh-TW.fmuser.org - >中國(繁體)
      hr.fmuser.org ->克羅地亞語
      cs.fmuser.org ->捷克
      da.fmuser.org ->丹麥語
      nl.fmuser.org - >荷蘭
      et.fmuser.org ->愛沙尼亞語
      tl.fmuser.org ->菲律賓
      fi.fmuser.org ->芬蘭語
      fr.fmuser.org - >法國
      gl.fmuser.org ->加利西亞語
      ka.fmuser.org ->喬治亞
      de.fmuser.org ->德語
      el.fmuser.org - >希臘
      ht.fmuser.org ->海地克里奧爾語
      iw.fmuser.org ->希伯來語
      hi.fmuser.org ->印地語
      hu.fmuser.org - >匈牙利
      is.fmuser.org ->冰島語
      id.fmuser.org ->印尼語
      ga.fmuser.org ->愛爾蘭
      it.fmuser.org - >意大利
      ja.fmuser.org ->日語
      ko.fmuser.org ->韓文
      lv.fmuser.org ->拉脫維亞
      lt.fmuser.org - >立陶宛
      mk.fmuser.org ->馬其頓語
      ms.fmuser.org ->馬來語
      mt.fmuser.org ->馬耳他語
      no.fmuser.org - >挪威
      fa.fmuser.org ->波斯語
      pl.fmuser.org ->波蘭語
      pt.fmuser.org ->葡萄牙語
      ro.fmuser.org - >羅馬尼亞
      ru.fmuser.org ->俄語
      sr.fmuser.org ->塞爾維亞語
      sk.fmuser.org ->斯洛伐克
      sl.fmuser.org - >斯洛文尼亞
      es.fmuser.org ->西班牙語
      sw.fmuser.org ->斯瓦希里語
      sv.fmuser.org ->瑞典語
      th.fmuser.org - >泰國
      tr.fmuser.org ->土耳其語
      uk.fmuser.org ->烏克蘭語
      ur.fmuser.org ->烏爾都語
      vi.fmuser.org - >越南
      cy.fmuser.org ->威爾士語
      yi.fmuser.org - >意第緒語

       
  •  

    FMUSER更輕鬆地傳輸視頻和音頻!

  • 聯絡我們

    地址:
    305廣州市環浦路273號匯蘭大廈510620室

    電子郵件:
    [電子郵件保護]

    電話/ WhatApps:
    + 8618078869184

  • 分類

  • 電子通訊

    名字或全名

    Email

  • 貝寶的解決方案  西聯匯款中國銀行
    電子郵件:[電子郵件保護]   WhatsApp:+8618078869184 Skype:sky198710021 跟我聊天
    版權所有2006-2020技術支持 www.fmuser.org

    聯絡我們