AndroidのService与Activity的及时通信

来源:互联网 发布:vb picturebox名称 编辑:程序博客网 时间:2024/06/05 03:36

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

希望各位看官不要喷我。

先看图片:

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

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

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

Activity的代码:

 

package com.bvin.demo.service;  import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout;  import com.bvin.demo.service.BoundService.LocalBinder;  public class MainActivity extends Activity {     /** Called when the activity is first created. */     Intent intent;     BoundService service;     boolean isBound;     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);               LinearLayout layout = new LinearLayout(this);         layout.setOrientation(LinearLayout.VERTICAL);         Button btStart = new Button(this);         btStart.setText("开始绑定");         Button btStop = new Button(this);         btStop.setText("解除绑定");         Button btGet = new Button(this);         btGet.setText("获取Service的内容");         Button btEnd = new Button(this);         btEnd.setText("停止获取");         layout.addView(btStart, params);         layout.addView(btStop, params);         layout.addView(btGet, params);          layout.addView(btEnd, params);          setContentView(layout);         intent  = new Intent(this,BoundService.class);         btStart.setOnClickListener(new View.OnClickListener() {                          @Override             public void onClick(View v) {                 // TODO Auto-generated method stub                 MainActivity.this.bindService(intent, conn, Context.BIND_AUTO_CREATE);             }         });         btStop.setOnClickListener(new View.OnClickListener() {                          @Override             public void onClick(View v) {                 // TODO Auto-generated method stub                 MainActivity.this.unbindService(conn);             }         });         btGet.setOnClickListener(new View.OnClickListener() {                          @Override             public void onClick(View v) {                 // TODO Auto-generated method stub                 handler.post(runnable);             }         });         btEnd.setOnClickListener(new View.OnClickListener() {                          @Override             public void onClick(View v) {                 // TODO Auto-generated method stub                 handler.removeCallbacks(runnable);             }         });              }          private Handler handler = new Handler(){          @Override         public void handleMessage(Message msg) {             // TODO Auto-generated method stub             super.handleMessage(msg);             setTitle(msg.what+"");         }              };          Runnable runnable = new Runnable(){          @Override         public void run() {             // TODO Auto-generated method stub             Message msg = new Message();             msg.what = MainActivity.this.service.getInt();             handler.sendMessage(msg);             handler.postDelayed(runnable, 2000);         }              };                    @Override     protected void onDestroy() {         // TODO Auto-generated method stub         super.onDestroy();         unbindService(conn);     }      private ServiceConnection conn = new ServiceConnection(){          @Override         public void onServiceConnected(ComponentName name, IBinder service) {             // TODO Auto-generated method stub             LocalBinder binder = (LocalBinder)service;             MainActivity.this.service = binder.getService();                                       isBound = true;         }          @Override         public void onServiceDisconnected(ComponentName name) {//连接断开服务里的线程就会摧毁             // TODO Auto-generated method stub             isBound = false;         }              }; }


 

 Service的代码:

 

package com.bvin.demo.service;  import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.util.Log;  public class BoundService extends Service{      private Handler handler  = new Handler(){          @Override         public void handleMessage(Message msg) {             // TODO Auto-generated method stub             super.handleMessage(msg);         }              };          int x = 0;          private Runnable runable = new Runnable(){          @Override         public void run() {             // TODO Auto-generated method stub             Log.e("数值", x+"");             x++;             handler.postDelayed(runable, 2000);         }              };          public int getInt(){         return x;     }           private Binder binder = new LocalBinder();          @Override     public IBinder onBind(Intent intent) {         // TODO Auto-generated method stub         Log.e("BoundService", "onBind");         return binder;     }      public class LocalBinder extends Binder{         BoundService getService(){             return BoundService.this;         }     }          @Override     public void onCreate() {//首次创建才调用         // TODO Auto-generated method stub         super.onCreate();         Log.e("BoundService", "onCreate");         handler.post(runable);     }      @Override     public void onDestroy() {//final摧毁         // TODO Auto-generated method stub         super.onDestroy();         Log.e("BoundService", "onDestroy");         //handler.removeCallbacks(runable);     }      @Override     public void onStart(Intent intent, int startId) {//开始,可能调用多次         // TODO Auto-generated method stub         super.onStart(intent, startId);         Log.e("BoundService", "onStart");     }      @Override     public boolean onUnbind(Intent intent) {//接触绑定         // TODO Auto-generated method stub         Log.e("BoundService", "onUnbind");         handler.removeCallbacks(runable);         return super.onUnbind(intent);     }      @Override     public void onRebind(Intent intent) {//重新绑定         // TODO Auto-generated method stub         super.onRebind(intent);         Log.e("BoundService", "onRebind");     }      @Override     public int onStartCommand(Intent intent, int flags, int startId) {//服务开始连接         // TODO Auto-generated method stub         Log.e("BoundService", "onStartCommand");         return super.onStartCommand(intent, flags, startId);     }                 }


 

 

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

原创粉丝点击