AndroidのService与Activity的及时通信

以前发表的博文一直都是没公布到博客园首页,因为怕高手笑话,但是想了想,如果一起讨论一起学习,不耻下问对自己无疑是更好,收获将更多。

希望各位看官不要喷我。

先看图片:

这里有四个按钮,第一个是绑定服务,绑定后,服务里的线程开始运行;第二个是解除绑定,解除绑定貌似只会回调Service的unBind()方法,所以还是要在服务的unBind()或destroy()方法里结束服务线程;第三个就是获取服务里的数据,并同步到Activity的标题;第三就是停止轮询调用获取服务线程的方法,这样就会停止轮询,你讲看到标题的字不会变化了,但是服务里的线程还在继续,因为还没有解除绑定服务。

这里有一个Activity和一个Service,里面各开一个线程,Activity线程用来刷新标题,Service线程用来改变数据,然后通过绑定服务获取服务的实例,然后就可以调用Service的方法了(笔者yy:要是可以在Activity里调用Service的方法多好啊,拉进了Activity和Service的距离,从此他们不再是交叉线而是螺线线!)

其中设计的知识还是挺多的,特别是多线程通信的内容,在Acitity里面我们需要用线程来更新界面,少不了要用到Handler和Message,接下来看代码,因为公司人都走了,就剩我还在这写博客,很想回家所以写的比较乱。

Activity的代码:

  1 package com.bvin.demo.service;
  2 
  3 import android.app.Activity;
  4 import android.content.ComponentName;
  5 import android.content.Context;
  6 import android.content.Intent;
  7 import android.content.ServiceConnection;
  8 import android.os.Bundle;
  9 import android.os.Handler;
 10 import android.os.IBinder;
 11 import android.os.Message;
 12 import android.view.View;
 13 import android.view.ViewGroup;
 14 import android.widget.Button;
 15 import android.widget.LinearLayout;
 16 
 17 import com.bvin.demo.service.BoundService.LocalBinder;
 18 
 19 public class MainActivity extends Activity {
 20     /** Called when the activity is first created. */
 21     Intent intent;
 22     BoundService service;
 23     boolean isBound;
 24     @Override
 25     public void onCreate(Bundle savedInstanceState) {
 26         super.onCreate(savedInstanceState);
 27         ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
 28      
 29         LinearLayout layout = new LinearLayout(this);
 30         layout.setOrientation(LinearLayout.VERTICAL);
 31         Button btStart = new Button(this);
 32         btStart.setText("开始绑定");
 33         Button btStop = new Button(this);
 34         btStop.setText("解除绑定");
 35         Button btGet = new Button(this);
 36         btGet.setText("获取Service的内容");
 37         Button btEnd = new Button(this);
 38         btEnd.setText("停止获取");
 39         layout.addView(btStart, params);
 40         layout.addView(btStop, params);
 41         layout.addView(btGet, params); 
 42         layout.addView(btEnd, params); 
 43         setContentView(layout);
 44         intent  = new Intent(this,BoundService.class);
 45         btStart.setOnClickListener(new View.OnClickListener() {
 46             
 47             @Override
 48             public void onClick(View v) {
 49                 // TODO Auto-generated method stub
 50                 MainActivity.this.bindService(intent, conn, Context.BIND_AUTO_CREATE);
 51             }
 52         });
 53         btStop.setOnClickListener(new View.OnClickListener() {
 54             
 55             @Override
 56             public void onClick(View v) {
 57                 // TODO Auto-generated method stub
 58                 MainActivity.this.unbindService(conn);
 59             }
 60         });
 61         btGet.setOnClickListener(new View.OnClickListener() {
 62             
 63             @Override
 64             public void onClick(View v) {
 65                 // TODO Auto-generated method stub
 66                 handler.post(runnable);
 67             }
 68         });
 69         btEnd.setOnClickListener(new View.OnClickListener() {
 70             
 71             @Override
 72             public void onClick(View v) {
 73                 // TODO Auto-generated method stub
 74                 handler.removeCallbacks(runnable);
 75             }
 76         });
 77         
 78     }
 79     
 80     private Handler handler = new Handler(){
 81 
 82         @Override
 83         public void handleMessage(Message msg) {
 84             // TODO Auto-generated method stub
 85             super.handleMessage(msg);
 86             setTitle(msg.what+"");
 87         }
 88         
 89     };
 90     
 91     Runnable runnable = new Runnable(){
 92 
 93         @Override
 94         public void run() {
 95             // TODO Auto-generated method stub
 96             Message msg = new Message();
 97             msg.what = MainActivity.this.service.getInt();
 98             handler.sendMessage(msg);
 99             handler.postDelayed(runnable, 2000);
100         }
101         
102     };
103     
104     
105     
106     @Override
107     protected void onDestroy() {
108         // TODO Auto-generated method stub
109         super.onDestroy();
110         unbindService(conn);
111     }
112 
113     private ServiceConnection conn = new ServiceConnection(){
114 
115         @Override
116         public void onServiceConnected(ComponentName name, IBinder service) {
117             // TODO Auto-generated method stub
118             LocalBinder binder = (LocalBinder)service;
119             MainActivity.this.service = binder.getService();
120             
121             
122             isBound = true;
123         }
124 
125         @Override
126         public void onServiceDisconnected(ComponentName name) {//连接断开服务里的线程就会摧毁
127             // TODO Auto-generated method stub
128             isBound = false;
129         }
130         
131     };
132 }

Service的代码:

  1 package com.bvin.demo.service;
  2 
  3 import android.app.Service;
  4 import android.content.Intent;
  5 import android.os.Binder;
  6 import android.os.Handler;
  7 import android.os.IBinder;
  8 import android.os.Message;
  9 import android.util.Log;
 10 
 11 public class BoundService extends Service{
 12 
 13     private Handler handler  = new Handler(){
 14 
 15         @Override
 16         public void handleMessage(Message msg) {
 17             // TODO Auto-generated method stub
 18             super.handleMessage(msg);
 19         }
 20         
 21     };
 22     
 23     int x = 0;
 24     
 25     private Runnable runable = new Runnable(){
 26 
 27         @Override
 28         public void run() {
 29             // TODO Auto-generated method stub
 30             Log.e("数值", x+"");
 31             x++;
 32             handler.postDelayed(runable, 2000);
 33         }
 34         
 35     };
 36     
 37     public int getInt(){
 38         return x;
 39     }
 40      
 41     private Binder binder = new LocalBinder();
 42     
 43     @Override
 44     public IBinder onBind(Intent intent) {
 45         // TODO Auto-generated method stub
 46         Log.e("BoundService", "onBind");
 47         return binder;
 48     }
 49 
 50     public class LocalBinder extends Binder{
 51         BoundService getService(){
 52             return BoundService.this;
 53         }
 54     }
 55     
 56     @Override
 57     public void onCreate() {//首次创建才调用
 58         // TODO Auto-generated method stub
 59         super.onCreate();
 60         Log.e("BoundService", "onCreate");
 61         handler.post(runable);
 62     }
 63 
 64     @Override
 65     public void onDestroy() {//final摧毁
 66         // TODO Auto-generated method stub
 67         super.onDestroy();
 68         Log.e("BoundService", "onDestroy");
 69         //handler.removeCallbacks(runable);
 70     }
 71 
 72     @Override
 73     public void onStart(Intent intent, int startId) {//开始,可能调用多次
 74         // TODO Auto-generated method stub
 75         super.onStart(intent, startId);
 76         Log.e("BoundService", "onStart");
 77     }
 78 
 79     @Override
 80     public boolean onUnbind(Intent intent) {//接触绑定
 81         // TODO Auto-generated method stub
 82         Log.e("BoundService", "onUnbind");
 83         handler.removeCallbacks(runable);
 84         return super.onUnbind(intent);
 85     }
 86 
 87     @Override
 88     public void onRebind(Intent intent) {//重新绑定
 89         // TODO Auto-generated method stub
 90         super.onRebind(intent);
 91         Log.e("BoundService", "onRebind");
 92     }
 93 
 94     @Override
 95     public int onStartCommand(Intent intent, int flags, int startId) {//服务开始连接
 96         // TODO Auto-generated method stub
 97         Log.e("BoundService", "onStartCommand");
 98         return super.onStartCommand(intent, flags, startId);
 99     }
100 
101     
102     
103     
104 }

 

 

 

记得在Manifest里注册上服务哦!

posted @ 2012-08-01 20:38  bvin  阅读(2080)  评论(1编辑  收藏  举报