一個後台工作的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),並不斷累加。