android service与activity交互的方试

1:android通过Handler与activity交互

这个实现起来比较简单,只需要把handler传递给service然后通过handler的handleMessage来更新界面就可以了,没什么难点。 我们来看看service里面的代码。 [java] view plain copy print ?
  1. publicclassSingleServiceextendsService{
  2. privatestaticHandlermhandler;//更新给前台的handler
  3. publicstaticvoidSetHandler(Handlerhandler)
  4. {
  5. mhandler=handler;
  6. }
  7. @Override
  8. publicvoidonCreate(){
  9. //TODOAuto-generatedmethodstub
  10. super.onCreate();
  11. if(mhandler!=null)
  12. {
  13. Messagemessage=newMessage();
  14. message.obj="serviceaction";
  15. mhandler.sendMessage(message);//更新消息
  16. }
  17. }
  18. @Override
  19. publicIBinderonBind(Intentarg0){
  20. //TODOAuto-generatedmethodstub
  21. returnnull;
  22. }
  23. }
然后我们来看看activity里面我们怎么处理的 [java] view plain copy print ?
  1. publicclassMainActivityextendsActivity{
  2. privateHandlerhandler=newHandler(){
  3. //处理消息
  4. @Override
  5. publicvoidhandleMessage(Messagemsg){
  6. //TODOAuto-generatedmethodstub
  7. super.handleMessage(msg);
  8. Toast.makeText(MainActivity.this,msg.obj.toString(),Toast.LENGTH_SHORT).show();
  9. }
  10. };
  11. @Override
  12. protectedvoidonCreate(BundlesavedInstanceState){
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. //传递handler
  16. SingleService.SetHandler(handler);
  17. //启动service
  18. startService(newIntent(MainActivity.this,SingleService.class));
  19. }
  20. }

2:利用bindservice

都知道service有两种启动方式,一种是startservice这种方式是不管你调用startservice再多次都service的oncreate方法都只执行一次,但是onstart方法会照样执行,它的生命周期也更启动它的activity没有关系,当activity销毁的时候service不会销毁,第二种方式是bindservice这种时候不管你怎么启动它也是只执行一次,但是他的生命周期却是和宿主activity绑定在一起的我们在activity中通过调用bindService来获取连接引用然后可以通过这个引用实现对service里面的数据操作。 这里我们定义一个接口 [java] view plain copy print ?
  1. /**
  2. *用户接口
  3. *@authorbobo
  4. *
  5. *@param<T>
  6. */
  7. publicinterfaceIService<T>{
  8. //用户接口
  9. publicTqury(intn);
  10. }

然后写我们的service [java] view plain copy print ?
  1. publicclassSingleServiceextendsService{
  2. privateStringname[]={"小红","小名","张三","李四"};
  3. IBinderbinder=newMyBinder();
  4. @Override
  5. publicvoidonCreate(){
  6. //TODOAuto-generatedmethodstub
  7. }
  8. //自己的业务处理方法
  9. publicStringqurys(intd){
  10. if(d>0&&0<4){
  11. returnname[d-1];
  12. }else
  13. returnnull;
  14. }
  15. @Override
  16. publicIBinderonBind(Intentarg0){
  17. //TODOAuto-generatedmethodstub
  18. //返回我们自定义的binder对象
  19. returnbinder;
  20. }
  21. /***
  22. *绑定类
  23. *@authorbobo
  24. *
  25. */
  26. publicclassMyBinderextendsBinderimplementsIService<String>{
  27. @Override
  28. //实现接口
  29. publicStringqury(intn){
  30. //TODOAuto-generatedmethodstub
  31. returnqurys(n);
  32. }
  33. }
  34. }

最后看看我们的activity里面的交互情况 [java] view plain copy print ?
  1. publicclassMainActivityextendsActivity{
  2. privateIService<String>iService;//定义接口
  3. privatemyConnectionconnection;//连接对象
  4. privateHandlerhandler=newHandler(){
  5. @Override
  6. publicvoidhandleMessage(Messagemsg){
  7. //TODOAuto-generatedmethodstub
  8. //刷新界面
  9. Toast.makeText(MainActivity.this,msg.obj.toString(),Toast.LENGTH_SHORT).show();
  10. super.handleMessage(msg);
  11. }
  12. };
  13. @Override
  14. protectedvoidonCreate(BundlesavedInstanceState){
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.activity_main);
  17. Intentservice=newIntent(MainActivity.this,SingleService.class);
  18. //实例化连接
  19. connection=newmyConnection();
  20. //启动service
  21. bindService(service,connection,BIND_AUTO_CREATE);
  22. //startService(newIntent(MainActivity.this,SingleService.class));
  23. }
  24. /***
  25. *通过这个类就与service绑定在了一起
  26. *@authorbobo
  27. *
  28. */
  29. classmyConnectionimplementsServiceConnection{
  30. @Override
  31. publicvoidonServiceConnected(ComponentNamename,IBinderservice){
  32. //TODOAuto-generatedmethodstub
  33. //获取到连接接口
  34. iService=(IService<String>)service;
  35. Messagemsg=newMessage();
  36. //调用service里面的方法
  37. msg.obj=iService.qury(3);
  38. handler.sendMessage(msg);
  39. }
  40. @Override
  41. publicvoidonServiceDisconnected(ComponentNamename){
  42. //TODOAuto-generatedmethodstub
  43. iService=null;
  44. }
  45. }
  46. }

3:利用broadcast

在前面讲到的方法中都不能太好的适应一个service对多个activity服务的情况,但是现在我们利用Broadcast可以较好的实现一个service给多个activity服务情况,业务逻辑是这样的,当我们的数据在service里面处理完成过后就可以通过发送广播通知activity更新界面在activity里注册广播监听。 service里面的代码 [java] view plain copy print ?
  1. publicclassSingleServiceextendsService{
  2. @Override
  3. publicvoidonCreate(){
  4. //TODOAuto-generatedmethodstub
  5. Intentintent=newIntent();
  6. intent.setAction("service.selection.test");//创建过滤条件
  7. intent.putExtra("key","serviceselection");//传递参数
  8. sendBroadcast(intent);
  9. }
  10. @Override
  11. publicIBinderonBind(Intentarg0){
  12. //TODOAuto-generatedmethodstub
  13. //返回我们自定义的binder对象
  14. returnnull;
  15. }
  16. }

然后是activity里面的代码 [java] view plain copy print ?
  1. publicclassMainActivityextendsActivity{
  2. privateHandlerhandler=newHandler(){
  3. @Override
  4. publicvoidhandleMessage(Messagemsg){
  5. //TODOAuto-generatedmethodstub
  6. //刷新界面
  7. Toast.makeText(MainActivity.this,msg.obj.toString(),Toast.LENGTH_SHORT).show();
  8. super.handleMessage(msg);
  9. }
  10. };
  11. @Override
  12. protectedvoidonCreate(BundlesavedInstanceState){
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. //注册广播事件并创建过滤器
  16. registerReceiver(newmyreceiver(),newIntentFilter("service.selection.test"));
  17. //启动service
  18. startService(newIntent(MainActivity.this,SingleService.class));
  19. }
  20. classmyreceiverextendsBroadcastReceiver{
  21. @Override
  22. publicvoidonReceive(Contextcontext,Intentintent){
  23. //获取传递过来的值
  24. Stringkey=intent.getStringExtra("key");
  25. Messagemessage=newMessage();
  26. message.obj=key;
  27. handler.sendMessage(message);
  28. }
  29. }
  30. }

4:自定义交互方式

前面都说道了,基本上这些交互方式就够一般的需求了,但是我就在想有没有一种方法可以更好的让一个service给多个activity服务,这样就不用每次都要在activity里面注册广播事件,这里就就写写我自己是怎么实现的方法。 [java] view plain copy print ?
  1. publicclassSingleServiceextendsService{
  2. publicstaticList<UIFresh>allactivity=newArrayList<UIFresh>();//创建一个容器来存取activity
  3. @Override
  4. publicvoidonCreate(){
  5. //TODOAuto-generatedmethodstub
  6. getActivityByName("MainActivity").refresh("Serviceaction");
  7. }
  8. /****
  9. *根据名字获取activity
  10. *@paramname
  11. *@return
  12. */
  13. privateUIFreshgetActivityByName(Stringname){
  14. UIFreshia=null;
  15. for(UIFreshac:allactivity){
  16. if(ac.getClass().getName().indexOf(name)>=0){
  17. ia=ac;
  18. }
  19. }
  20. returnia;
  21. }
  22. @Override
  23. publicIBinderonBind(Intentarg0){
  24. //TODOAuto-generatedmethodstub
  25. returnnull;
  26. }
  27. }

然后是activity里面 [java] view plain copy print ?
  1. publicclassMainActivityextendsActivityimplementsUIFresh{
  2. privateHandlerhandler=newHandler(){
  3. @Override
  4. publicvoidhandleMessage(Messagemsg){
  5. //TODOAuto-generatedmethodstub
  6. //刷新界面
  7. Toast.makeText(MainActivity.this,msg.obj.toString(),Toast.LENGTH_SHORT).show();
  8. super.handleMessage(msg);
  9. }
  10. };
  11. @Override
  12. protectedvoidonCreate(BundlesavedInstanceState){
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. //把activity加入管理列表
  16. SingleService.allactivity.add(this);
  17. //启动service
  18. startService(newIntent(MainActivity.this,SingleService.class));
  19. }
  20. /****
  21. *实现接口
  22. */
  23. @Override
  24. publicvoidrefresh(Object...objects){
  25. Messagemessage=newMessage();
  26. message.obj=objects[0];
  27. handler.sendMessage(message);
  28. }
  29. }

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

更多相关文章

  1. Android(安卓)AsyncTask和Handler对比
  2. android源码下载方法 批量下载 基于windows os
  3. Android(安卓)Phonebook编写联系人UI加载及联系人保存流程(四)
  4. Android(安卓)Studio使用AIDL技术进行SDK开发
  5. 在Android(安卓)Studio中运行java main方法
  6. 用GDB远程调试android native程序
  7. Android定时器Timer.schedule
  8. [Android(安卓)Studio] 关于*.SO压缩问题
  9. Android-EventBus(手写简易版)

随机推荐

  1. Android(安卓)Service
  2. Android多媒体框架3月变化
  3. Android(安卓)View概述
  4. 记录一下八款开源 Android(安卓)游戏引擎
  5. Android(安卓)浮动视图效果 第三种实现方
  6. Windows Phone与Android风格的对比
  7. Android(安卓)人脸识别了解一下 (上)
  8. SQLite在Android中的使用
  9. Android(安卓)L开发指南
  10. Android(安卓)如何将定制的Launcher成为