android service与activity交互的方试

android service与activity交互的方试

1:android通过Handler与activity交互

这个实现起来比较简单,只需要把handler传递给service然后通过handler的handleMessage来更新界面就可以了,没什么难点。
我们来看看service里面的代码。
[java] view plain copy print ?
  1. public class SingleService extends Service {  
  2.   
  3.     private static Handler mhandler;//更新给前台的handler  
  4.       
  5.     public static void SetHandler(Handler handler)  
  6.     {  
  7.         mhandler = handler;  
  8.     }  
  9.       
  10.     @Override  
  11.     public void onCreate() {  
  12.         // TODO Auto-generated method stub  
  13.         super.onCreate();  
  14.         if(mhandler!=null)  
  15.         {  
  16.         Message message = new Message();  
  17.         message.obj = "service action";  
  18.         mhandler.sendMessage(message);//更新消息  
  19.         }  
  20.     }  
  21.   
  22.     @Override  
  23.     public IBinder onBind(Intent arg0) {  
  24.         // TODO Auto-generated method stub  
  25.         return null;  
  26.     }  
  27.   
  28. }  
然后我们来看看activity里面我们怎么处理的
[java] view plain copy print ?
  1. public class MainActivity extends Activity {  
  2.   
  3.     private Handler handler = new Handler() {  
  4.         //处理消息  
  5.         @Override  
  6.         public void handleMessage(Message msg) {  
  7.             // TODO Auto-generated method stub  
  8.             super.handleMessage(msg);  
  9.             Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();  
  10.         }  
  11.   
  12.     };  
  13.   
  14.     @Override  
  15.     protected void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.activity_main);  
  18.         //传递handler  
  19.         SingleService.SetHandler(handler);  
  20.         //启动service  
  21.         startService(new Intent(MainActivity.this, SingleService.class));  
  22.     }  
  23.   
  24.   
  25. }  

2:利用bindservice

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

然后写我们的service
[java] view plain copy print ?
  1. public class SingleService extends Service {  
  2.     private String name[] = { "小红""小名""张三""李四" };  
  3.   
  4.     IBinder binder = new MyBinder();  
  5.   
  6.     @Override  
  7.     public void onCreate() {  
  8.         // TODO Auto-generated method stub  
  9.     }  
  10.   
  11.     //自己的业务处理方法  
  12.     public String qurys(int d) {  
  13.         if (d > 0 && 0 < 4) {  
  14.             return name[d - 1];  
  15.         } else  
  16.             return null;  
  17.     }  
  18.   
  19.     @Override  
  20.     public IBinder onBind(Intent arg0) {  
  21.         // TODO Auto-generated method stub  
  22.         //返回我们自定义的binder对象  
  23.         return binder;  
  24.     }  
  25.   
  26.     /*** 
  27.      * 绑定类 
  28.      * @author bobo 
  29.      * 
  30.      */  
  31.     public class MyBinder extends Binder implements IService<String> {  
  32.   
  33.         @Override  
  34.         //实现接口  
  35.         public String qury(int n) {  
  36.             // TODO Auto-generated method stub  
  37.             return qurys(n);  
  38.         }  
  39.   
  40.     }  
  41. }  

最后看看我们的activity里面的交互情况
[java] view plain copy print ?
  1. public class MainActivity extends Activity {  
  2.   
  3.     private IService<String> iService;//定义接口  
  4.     private myConnection connection;//连接对象  
  5.   
  6.     private Handler handler = new Handler() {  
  7.   
  8.         @Override  
  9.         public void handleMessage(Message msg) {  
  10.             // TODO Auto-generated method stub  
  11.             //刷新界面  
  12.             Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();  
  13.             super.handleMessage(msg);  
  14.         }  
  15.   
  16.     };  
  17.   
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.activity_main);  
  22.         Intent service = new Intent(MainActivity.this, SingleService.class);  
  23.         //实例化连接  
  24.         connection = new myConnection();  
  25.         //启动service  
  26.         bindService(service, connection, BIND_AUTO_CREATE);  
  27.       
  28.         //startService(new Intent(MainActivity.this, SingleService.class));  
  29.     }  
  30.   
  31.     /*** 
  32.      * 通过这个类就与service绑定在了一起 
  33.      * @author bobo 
  34.      * 
  35.      */  
  36.     class myConnection implements ServiceConnection {  
  37.   
  38.         @Override  
  39.         public void onServiceConnected(ComponentName name, IBinder service) {  
  40.             // TODO Auto-generated method stub  
  41.             //获取到连接接口  
  42.             iService = (IService<String>) service;  
  43.             Message msg = new Message();  
  44.             //调用service里面的方法  
  45.             msg.obj = iService.qury(3);  
  46.             handler.sendMessage(msg);  
  47.   
  48.         }  
  49.   
  50.         @Override  
  51.         public void onServiceDisconnected(ComponentName name) {  
  52.             // TODO Auto-generated method stub  
  53.             iService = null;  
  54.         }  
  55.   
  56.     }  
  57. }  

3:利用broadcast

在前面讲到的方法中都不能太好的适应一个service对多个activity服务的情况,但是现在我们利用Broadcast可以较好的实现一个service给多个activity服务情况,业务逻辑是这样的,当我们的数据在service里面处理完成过后就可以通过发送广播通知activity更新界面在activity里注册广播监听。
service里面的代码
[java] view plain copy print ?
  1. public class SingleService extends Service {  
  2.     @Override  
  3.   
  4.     public void onCreate() {  
  5.         // TODO Auto-generated method stub  
  6.         Intent intent = new Intent();  
  7.         intent.setAction("service.selection.test");//创建过滤条件  
  8.         intent.putExtra("key""service selection");//传递参数  
  9.         sendBroadcast(intent);  
  10.     }  
  11.   
  12.   
  13.   
  14.     @Override  
  15.     public IBinder onBind(Intent arg0) {  
  16.         // TODO Auto-generated method stub  
  17.         //返回我们自定义的binder对象  
  18.         return null;  
  19.     }  
  20.   
  21.   
  22. }  

然后是activity里面的代码
[java] view plain copy print ?
  1. public class MainActivity extends Activity {  
  2.   
  3.     private Handler handler = new Handler() {  
  4.   
  5.         @Override  
  6.         public void handleMessage(Message msg) {  
  7.             // TODO Auto-generated method stub  
  8.             //刷新界面  
  9.             Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();  
  10.             super.handleMessage(msg);  
  11.         }  
  12.   
  13.     };  
  14.   
  15.     @Override  
  16.     protected void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.activity_main);  
  19.         //注册广播事件并创建过滤器  
  20.         registerReceiver(new myreceiver(), new IntentFilter("service.selection.test"));  
  21.         //启动service  
  22.         startService(new Intent(MainActivity.this, SingleService.class));  
  23.     }  
  24.   
  25.     class myreceiver extends BroadcastReceiver {  
  26.   
  27.         @Override  
  28.         public void onReceive(Context context, Intent intent) {  
  29.             //获取传递过来的值  
  30.             String key = intent.getStringExtra("key");  
  31.             Message message = new Message();  
  32.             message.obj = key;  
  33.             handler.sendMessage(message);  
  34.         }  
  35.   
  36.     }  
  37. }  

4:自定义交互方式

前面都说道了,基本上这些交互方式就够一般的需求了,但是我就在想有没有一种方法可以更好的让一个service给多个activity服务,这样就不用每次都要在activity里面注册广播事件,这里就就写写我自己是怎么实现的方法。
[java] view plain copy print ?
  1. public class SingleService extends Service {  
  2.     public static List<UIFresh> allactivity = new ArrayList<UIFresh>();//创建一个容器来存取activity  
  3.   
  4.     @Override  
  5.     public void onCreate() {  
  6.         // TODO Auto-generated method stub  
  7.         getActivityByName("MainActivity").refresh("Service action");  
  8.     }  
  9.   
  10.     /**** 
  11.      * 根据名字获取activity 
  12.      * @param name 
  13.      * @return 
  14.      */  
  15.     private UIFresh getActivityByName(String name) {  
  16.         UIFresh ia = null;  
  17.         for (UIFresh ac : allactivity) {  
  18.             if (ac.getClass().getName().indexOf(name) >= 0) {  
  19.                 ia = ac;  
  20.             }  
  21.         }  
  22.         return ia;  
  23.   
  24.     }  
  25.   
  26.     @Override  
  27.     public IBinder onBind(Intent arg0) {  
  28.         // TODO Auto-generated method stub  
  29.         return null;  
  30.     }  
  31.   
  32. }  

然后是activity里面
[java] view plain copy print ?
  1. public class MainActivity extends Activity implements UIFresh{  
  2.   
  3.     private Handler handler = new Handler() {  
  4.   
  5.         @Override  
  6.         public void handleMessage(Message msg) {  
  7.             // TODO Auto-generated method stub  
  8.             //刷新界面  
  9.             Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();  
  10.             super.handleMessage(msg);  
  11.         }  
  12.   
  13.     };  
  14.   
  15.     @Override  
  16.     protected void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.activity_main);  
  19.         //把activity加入管理列表  
  20.         SingleService.allactivity.add(this);  
  21.         //启动service  
  22.         startService(new Intent(MainActivity.this, SingleService.class));  
  23.     }  
  24. /**** 
  25.  * 实现接口 
  26.  */  
  27.     @Override  
  28.     public void refresh(Object... objects) {  
  29.         Message message = new Message();  
  30.         message.obj = objects[0];  
  31.         handler.sendMessage(message);  
  32.           
  33.     }  
  34.   
  35. }  

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

你可能感兴趣的:(android service与activity交互的方试)