安卓学习之路-Broadcast学习

经过了两天的学习对安卓的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.注册广播

到些本次实例介绍完了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值