经过了两天的学习对安卓的Broadcast也有点了解了,为了加深印象所以找个时间写了这篇文章。
安卓的四大组件,现在已经学习了其中3个,我也被安卓的魅力所吸引,一直跟着老罗的博客学习(跟着高手混就是不错啊~!~)
进入正题,说下broadcast在安卓中的实现,我只做了简单的实现。广播顾名思义,就是给其它人发消息,发通知。
所以咱们首先要做一个广播站(CounterService类这是实例中的广播站,就是一个服务)
IcounterService接口
package com.myproject.myproject.service;
/**
* 广播服务接口
* @author chenhr5
*
*/
public interface ICounterService {
public void startCounter();//启动服务
public void stopCounter();//停止服务
}
C
ounterService类(实现IcounterService接口接口)
package com.myproject.myproject.service.impl;
import android.app.Service;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import com.myproject.myproject.service.ICounterService;
/**
* 广播服务实现类
* @author chenhr5
*
*/
public class CounterService extends Service implements ICounterService{
private static final String LOG_COUNTERSERVICE = "com.myproject.myproject.service.impl.CounterService";
//intentFilter过滤目标
public static final String BROADCAST = "com.myproject.myproject.service.impl.CounterService.ACTION";
//intent传值用的key
public static final String COUNTER = "counter";
//服务停止和启动的标志
private boolean stop = false;
//用于client(activity)和service之间通信
private final IBinder binder = new CounterBinder();
/**
* 内部类定义binder
* 目的是在client中 可以获得绑定的service对象
* @author chenhr5
*
*/
public class CounterBinder extends Binder{
public CounterService getService(){
return CounterService.this;
}
}
@Override
public void onCreate() {
super.onCreate();
Log.d(LOG_COUNTERSERVICE, "onCreate....");
}
@Override
public void onRebind(Intent intent) {
super.onRebind(intent);
Log.d(LOG_COUNTERSERVICE, "onRebind....");
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Log.d(LOG_COUNTERSERVICE,"onStart.....");
}
/**
* 启动服务的方法,可以把这里想象成一个复杂的业务处理方法,
* 所以这里我启用了一个异步任务(任务在安卓中的概念可以上网查找资料)
*/
@Override
public void startCounter() {
AsyncTask<Integer, Integer, Integer> task = new AsyncTask<Integer, Integer, Integer>(){
@Override
protected Integer doInBackground(Integer... arg0) {
Integer value = arg0[0];
stop = false;
while(!stop){
//这里把每次业务的处理结果分布到线程中,会触发下面的onProgressUpdate方法
publishProgress(value);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
value++;
}
return value;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
int value = values[0];
Intent intent = new Intent(BROADCAST);//这是一个标志为BROADCAST(对应的action值第19行代码)的intent
intent.putExtra(COUNTER, value);
//发送广播
sendBroadcast(intent);
}
/**
* 异步任务可以执行时走这个方法
*/
@Override
protected void onPostExecute(Integer result) {
int value = result;
Intent intent = new Intent(BROADCAST);
intent.putExtra(COUNTER, value);
sendBroadcast(intent);
}
};
task.execute(0);//执行任务,参数0传入到doInBackground方法
}
/**
* 停止服务
*/
@Override
public void stopCounter() {
stop = true;
Log.d(LOG_COUNTERSERVICE, "stop....");
}
/**
* 绑定服务时要返回binder
*/
@Override
public IBinder onBind(Intent arg0) {
Log.d(LOG_COUNTERSERVICE,"onBind....");
return binder;
}
}
到了这里咱们的广播站就建完了,总结下都做了些什么事。
1.用异步任务类实现了一个处理业务的方法,并且负责发送广播。
2.定义了一个通信员binder。
没错!步骤不是很难,咱们继续。。。。
广播站建完了,现在咱们要去做收音机了,有广播没有收音机怎么听广播啊。。。。
这是一个界面类BroadcastFragment
<span style="background-color: rgb(255, 255, 255);">package com.myproject.myproject.fragment;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import com.myproject.myproject.R;
import com.myproject.myproject.service.ICounterService;
import com.myproject.myproject.service.impl.CounterService;
/**
* 界面类,接收广播消息
* @author chenhr5
*
*/
public class BroadcastFragment extends Fragment implements OnClickListener{
private TextView tv;
//服务
private ICounterService counterService;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_broadcast, container,false);
Button btn_send = (Button)rootView.findViewById(R.id.btn_send_broadcast);
tv = (TextView)rootView.findViewById(R.id.tv_counter);
btn_send.setOnClickListener(this);
//绑定服务
Intent intent = new Intent(getActivity(),CounterService.class);
getActivity().bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
//注册广播,filter负责过滤广播
IntentFilter filter = new IntentFilter(CounterService.BROADCAST);
getActivity().registerReceiver(broadcastReceiver, filter);
return rootView;
}
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName arg0) {
counterService = null;
}
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
counterService = ((CounterService.CounterBinder)arg1).getService();
}
};
//广播接收器
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
String value = String.valueOf(arg1.getIntExtra(CounterService.COUNTER, 10000));
tv.setText(value);
}
};
@Override
public void onClick(View arg0) {
if(arg0.getId()==R.id.btn_send_broadcast){
if(counterService!=null){
counterService.startCounter();
}
}
}
/**
* 当界面被销毁时,要给服务解绑。
*/
@Override
public void onDestroy() {
super.onDestroy();
getActivity().unbindService(serviceConnection);
}
/**
* 不界面暂停时,要注销广播
*/
@Override
public void onPause() {
super.onPause();
getActivity().unregisterReceiver(broadcastReceiver);
}
/**
* 界面重启时,要重新注册广播
*/
@Override
public void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter(CounterService.BROADCAST);
getActivity().registerReceiver(broadcastReceiver, filter);
}
}</span>
在这里咱们主要做了以下几件事:
1.绑定服务
2.定义接收器
3.注册广播
到些本次实例介绍完了。