andorid service activity交互方式

来源:互联网 发布:广州天际网络 编辑:程序博客网 时间:2024/05/18 01:26

android service与activity交互的方试

1:android通过Handler与activity交互

这个实现起来比较简单,只需要把handler传递给service然后通过handler的handleMessage来更新界面就可以了,没什么难点。
我们来看看service里面的代码。
public class SingleService extends Service {private static Handler mhandler;//更新给前台的handlerpublic static void SetHandler(Handler handler){mhandler = handler;}@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();if(mhandler!=null){Message message = new Message();message.obj = "service action";mhandler.sendMessage(message);//更新消息}}@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stubreturn null;}}
然后我们来看看activity里面我们怎么处理的
public class MainActivity extends Activity {private Handler handler = new Handler() {//处理消息@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//传递handlerSingleService.SetHandler(handler);//启动servicestartService(new Intent(MainActivity.this, SingleService.class));}}

2:利用bindservice

都知道service有两种启动方式,一种是startservice这种方式是不管你调用startservice再多次都service的oncreate方法都只执行一次,但是onstart方法会照样执行,它的生命周期也更启动它的activity没有关系,当activity销毁的时候service不会销毁,第二种方式是bindservice这种时候不管你怎么启动它也是只执行一次,但是他的生命周期却是和宿主activity绑定在一起的我们在activity中通过调用bindService来获取连接引用然后可以通过这个引用实现对service里面的数据操作。
这里我们定义一个接口
/** * 用户接口 * @author bobo * * @param <T> */public interface IService <T>{//用户接口public T qury(int n);}

然后写我们的service
public class SingleService extends Service {private String name[] = { "小红", "小名", "张三", "李四" };IBinder binder = new MyBinder();@Overridepublic void onCreate() {// TODO Auto-generated method stub}//自己的业务处理方法public String qurys(int d) {if (d > 0 && 0 < 4) {return name[d - 1];} elsereturn null;}@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stub//返回我们自定义的binder对象return binder;}/*** * 绑定类 * @author bobo * */public class MyBinder extends Binder implements IService<String> {@Override//实现接口public String qury(int n) {// TODO Auto-generated method stubreturn qurys(n);}}}

最后看看我们的activity里面的交互情况
public class MainActivity extends Activity {private IService<String> iService;//定义接口private myConnection connection;//连接对象private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stub//刷新界面Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();super.handleMessage(msg);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent service = new Intent(MainActivity.this, SingleService.class);//实例化连接connection = new myConnection();//启动servicebindService(service, connection, BIND_AUTO_CREATE);//startService(new Intent(MainActivity.this, SingleService.class));}/*** * 通过这个类就与service绑定在了一起 * @author bobo * */class myConnection implements ServiceConnection {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stub//获取到连接接口iService = (IService<String>) service;Message msg = new Message();//调用service里面的方法msg.obj = iService.qury(3);handler.sendMessage(msg);}@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stubiService = null;}}}

3:利用broadcast

在前面讲到的方法中都不能太好的适应一个service对多个activity服务的情况,但是现在我们利用Broadcast可以较好的实现一个service给多个activity服务情况,业务逻辑是这样的,当我们的数据在service里面处理完成过后就可以通过发送广播通知activity更新界面在activity里注册广播监听。
service里面的代码
public class SingleService extends Service {@Overridepublic void onCreate() {// TODO Auto-generated method stubIntent intent = new Intent();intent.setAction("service.selection.test");//创建过滤条件intent.putExtra("key", "service selection");//传递参数sendBroadcast(intent);}@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stub//返回我们自定义的binder对象return null;}}

然后是activity里面的代码
public class MainActivity extends Activity {private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stub//刷新界面Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();super.handleMessage(msg);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//注册广播事件并创建过滤器registerReceiver(new myreceiver(), new IntentFilter("service.selection.test"));//启动servicestartService(new Intent(MainActivity.this, SingleService.class));}class myreceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {//获取传递过来的值String key = intent.getStringExtra("key");Message message = new Message();message.obj = key;handler.sendMessage(message);}}}

4:自定义交互方式

前面都说道了,基本上这些交互方式就够一般的需求了,但是我就在想有没有一种方法可以更好的让一个service给多个activity服务,这样就不用每次都要在activity里面注册广播事件,这里就就写写我自己是怎么实现的方法。
public class SingleService extends Service {public static List<UIFresh> allactivity = new ArrayList<UIFresh>();//创建一个容器来存取activity@Overridepublic void onCreate() {// TODO Auto-generated method stubgetActivityByName("MainActivity").refresh("Service action");}/**** * 根据名字获取activity * @param name * @return */private UIFresh getActivityByName(String name) {UIFresh ia = null;for (UIFresh ac : allactivity) {if (ac.getClass().getName().indexOf(name) >= 0) {ia = ac;}}return ia;}@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stubreturn null;}}

然后是activity里面
public class MainActivity extends Activity implements UIFresh{private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stub//刷新界面Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();super.handleMessage(msg);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//把activity加入管理列表SingleService.allactivity.add(this);//启动servicestartService(new Intent(MainActivity.this, SingleService.class));}/**** * 实现接口 */@Overridepublic void refresh(Object... objects) {Message message = new Message();message.obj = objects[0];handler.sendMessage(message);}}

这样就可以很好的根据自己的需要与service交互了