以前发表的博文一直都是没公布到博客园首页,因为怕高手笑话,但是想了想,如果一起讨论一起学习,不耻下问对自己无疑是更好,收获将更多。
希望各位看官不要喷我。
先看图片:
这里有四个按钮,第一个是绑定服务,绑定后,服务里的线程开始运行;第二个是解除绑定,解除绑定貌似只会回调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里注册上服务哦!