[Android] BroadcastReceiver (Service send-->receive Activity)

一個後台工作的Service除了可以通過Notification的方式將一些資訊顯示出來,也可以透過Broadcast的方式將資訊廣播出去,讓Activity接收該廣播之資料並顯示在UI上。另外也可從Activity端廣播由Service接收,本篇文章將單方面介紹如何從一個Service將資料廣播出去,並由Activity接收。

一個後台工作的Service透過Broadcast的方式將資訊廣播出去,Activity將可得到該廣播的資料,也或者可以相反,廣播端放在Activity,而Service接收,以下將進行Service(廣播) Activity(接收)之範例。

依照慣例,建立一個繼承Service的class 名為BroadService,

其Layout介面如下圖,當application一開啟時,後台工作的Service將不斷地向外廣播資料,而Activity創立一個BroadcastReceiver接收該廣播之資料並顯示在TextView上。

首先由BroadService先撰寫發送廣播的code,如下:

BroadService.java (廣播端)

    int count=0;
    private Handler samHandler=new Handler();
    private Runnable samRun=new Runnable() {
        @Override
        public void run() {
            Intent broadIntent=new Intent("samBroadcast"); //建立一個Intent,並對該Intent之action命名
            broadIntent.putExtra("num",count);    //將count放入Intent中
            sendBroadcast(broadIntent);           //將該存放資料之Intent廣播出去
            count++;
            Log.d("samTag","Broadcast");
            samHandler.postDelayed(this,1000);
        }
    };

如果有看過前幾篇Service實作的朋友,應該對上面幾行程式碼相當眼熟,在此Service class當中,與前幾篇Service範例並無太大差別,只改變了Runnable內的操作而已。

廣播端的操作非常簡單,在廣播之前,先建立一個Intent broadIntent,並對該Intent之action命名為"samBroadcast",此舉是為了對該廣播命名,因此外面的BroadcastReceiver只要判別到該廣播之名稱即可將資料接收下來。 接著將資料利用putExtra()存放好後,接著利用sendBroadcast(Intent intent),將該Intent廣播出去。

發送端三步驟:
1. 建立一個要廣播出去的Intent,並對該Intent之action命名 =============> Intent broadIntent=new Intent("samBroadcast");
2. 將所要廣播出去之資料存入Intent裡  ===========================>  broadIntent.putExtra("num",count");
3. 透過sendBroadcast()將該Intent廣播出去========================>  sendBroadcast(broadIntent);

 

 

 MainActivity.java (接收端)

private TextView tv1;
Intent serviceIntent;
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv1=(TextView)findViewById(R.id.tv1ID);

        BroadcastReceiver receiver=new BroadcastReceiver() {    //建立一個BroadcastReceiver
            @Override
            public void onReceive(Context context, Intent intent) {//該reveicer接收到廣播後,執行下列動作
                Log.d("samTag","Receiver");
                int num=intent.getIntExtra("num",0); //將接收到的Intent內的資料讀取出來
                tv1.setText(num+"");                   //將所讀到之資料顯示在TextView上
            }
        };

        IntentFilter samfilter=new IntentFilter("samBroadcast"); //建立IntentFilter過濾器,過濾所需要之Intent
        registerReceiver(receiver,samfilter);//註冊Receiver,其兩個參數分別為receiver與filter

         serviceIntent=new Intent(this,BroadService.class); //建立Service之Intent
        startService(serviceIntent);  //啟動Service
    }
接收端三步驟:
1. 建立BroadcastReceiver function,該function主要是當接收到所要之廣播時,所需執行的動作。
2. 建立一個IntentFilter,為Intent過濾器,在所有廣播訊息中,利用此過濾器能得到所需要之廣播。 ====>IntentFilter samfilter=new IntentFilter("samBroadcast") //其參數為所需接收到之廣播之action名稱
3. 註冊Receiver,使該receiver啟動,使用的參數分別為所建立的receiver與filter(類似該receiver之function與filter名稱綁定的概念)。

最後在建立一個開啟Service的Intent並start即可。

最後在Activity上看到TextView不斷顯示由Service端廣播出來的資料(count),並不斷累加。