BroadCastRecieve

来源:http://www.cnblogs.com/hongguang-kim/archive/2016/06/25/5616432.html
-Advertisement-
Play Games

首先介紹一下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”

 你會發現廣播發送出去以後註冊此廣播的廣播接收者是可以收到此消息的。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 當我們在使用tableview時,往往需要在cell左滑時顯示一個或是多個按鈕,但系統預設的只可顯示一個,如常見的刪除按鈕,那麼當我們的需求要求要有多個按鈕時又該怎麼辦呢,我們往下看。 首先,現看看系統的按鈕(只顯示一個按鈕時) //設置cell左滑後的刪除按鈕文字 -(NSString *)tab ...
  • //佈局相關<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" an ...
  • 這個項目是本人原創:要轉載,請說明下:http://www.cnblogs.com/blogwithstudyofwyn/p/5618107.html 項目的地址:https://github.com/Shangshanroushui/ShoppingCart.git 該程式是個一元奪寶的的購物車。 ...
  • ...
  • 一.什麼是Service Service是一個應用程式組件,它是安卓實現程式後臺運行的一個解決方案。 二.分類 服務有兩種類別started、bound.但是一個服務類所要繼承的類是一樣的,都是Service類。也就是說,一個服務,可以包含上面兩種運行方式的服務,只是與它重載的方法有關,如果重寫了o ...
  • 我以自己項目中的一個模塊為例,首先有兩個頁面,第一個頁面為顯示城市頁面,第二個頁面為選擇要使用block傳的值(城市名)。 第一個頁面中的顯示控制項: //自定義左部定位視圖 self.locView = [[LocationView alloc] initWithFrame:CGRectMake(0 ...
  • 滾動視圖:在根視圖中添加UIScrollViewDelegate協議,聲明一些對象屬性 在程式中導入圖片,在.m文件中的代碼實現: 推薦:http://www.cnblogs.com/roucheng/p/3528371.html ...
  • 1.手機助手 1.1 USB鏈接 可以讀取手機的PID和VID,確定唯一的設備,可以給手機安裝對應的驅動等 socket在固定埠通信 1.2 WIFI鏈接 pc在電腦在整個網段發送UDP數據包,手機連接wifi後可以監聽這個埠,收到數據包,試圖與pc機建立連接 1.3 藍牙 通過Bluetoot ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...