在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activity中启动后台Service,通过Intent来启动,Intent中我们可以传递数据给Service,而当我们Service执行某些操作之后想要更新UI线程,我们可以用两种方式来实现Service与Activity之间的通信问题

转载自:

  • 通过Binder对象

当Activity通过调用bindService(Intent service, ServiceConnection conn,int flags),我们可以得到一个Service的一个对象实例,然后我们就可以访问Service中的方法,我们还是通过一个例子来理解一下吧,一个模拟下载的小例子,带大家理解一下通过Binder通信的方式

首先我们新建一个工程Communication,然后新建一个Service类

[java] 

  1. package com.example.communication;  

  2.   

  3. import android.app.Service;  

  4. import android.content.Intent;  

  5. import android.os.Binder;  

  6. import android.os.IBinder;  

  7.   

  8. public class MsgService extends Service {  

  9.     /** 

  10.      * 进度条的最大值 

  11.      */  

  12.     public static final int MAX_PROGRESS = 100;  

  13.     /** 

  14.      * 进度条的进度值 

  15.      */  

  16.     private int progress = 0;  

  17.   

  18.     /** 

  19.      * 增加get()方法,供Activity调用 

  20.      * @return 下载进度 

  21.      */  

  22.     public int getProgress() {  

  23.         return progress;  

  24.     }  

  25.   

  26.     /** 

  27.      * 模拟下载任务,每秒钟更新一次 

  28.      */  

  29.     public void startDownLoad(){  

  30.         new Thread(new Runnable() {  

  31.               

  32.             @Override  

  33.             public void run() {  

  34.                 while(progress < MAX_PROGRESS){  

  35.                     progress += 5;  

  36.                     try {  

  37.                         Thread.sleep(1000);  

  38.                     } catch (InterruptedException e) {  

  39.                         e.printStackTrace();  

  40.                     }     

  41.                 }  

  42.             }  

  43.         }).start();  

  44.     }  

  45.     /** 

  46.      * 返回一个Binder对象 

  47.      */  

  48.     @Override  

  49.     public IBinder onBind(Intent intent) {  

  50.         return new MsgBinder();  

  51.     }  

  52.     public class MsgBinder extends Binder{  

  53.         /** 

  54.          * 获取当前Service的实例 

  55.          * @return 

  56.          */  

  57.         public MsgService getService(){  

  58.             return MsgService.this;  

  59.         }  

  60.     }  

  61. }

这里是要更新下载进度,service和Activity中传递这个进度数据

  1. Intent intent = new Intent("com.example.communication.MSG_ACTION");    

  2. bindService(intent, conn, Context.BIND_AUTO_CREATE);  

通过上面的代码我们就在Activity绑定了一个Service,上面需要一个ServiceConnection对象,它是一个接口,我们这里使用了匿名内部类

  1.  ServiceConnection conn = new ServiceConnection() {  

  2.           

  3.         @Override  

  4.         public void onServiceDisconnected(ComponentName name) {  

  5.               

  6.         }     

  7.         @Override  

  8.         public void onServiceConnected(ComponentName name, IBinder service) {  

  9.             //返回一个MsgService对象  

  10.             msgService = ((MsgService.MsgBinder)service).getService() 

  11.         }  

  12.     };

在onServiceConnected(ComponentName name, IBinder service) 回调方法中,返回了一个MsgService中的Binder对象,我们可以通过getService()方法来得到一个MsgService对象,然后可以调用MsgService中的一些方法,Activity的代码如下

  1. package com.example.communication;  

  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.IBinder;  

  10. import android.view.View;  

  11. import android.view.View.OnClickListener;  

  12. import android.widget.Button;  

  13. import android.widget.ProgressBar;  

  14.   

  15. public class MainActivity extends Activity {  

  16.     private MsgService msgService;  

  17.     private int progress = 0;  

  18.     private ProgressBar mProgressBar;  

  19.     @Override  

  20.     protected void onCreate(Bundle savedInstanceState) {  

  21.         super.onCreate(savedInstanceState);  

  22.         setContentView(R.layout.activity_main);    

  23.        //绑定Service  

  24.         Intent intent = new Intent("com.example.communication.MSG_ACTION");  

  25.         bindService(intent, conn, Context.BIND_AUTO_CREATE);  

  26.           

  27.           

  28.         mProgressBar = (ProgressBar) findViewById(R.id.progressBar1);  

  29.         Button mButton = (Button) findViewById(R.id.button1);  

  30.         mButton.setOnClickListener(new OnClickListener() {  

  31.               

  32.             @Override  

  33.             public void onClick(View v) {  

  34.                 //开始下载  

  35.                 msgService.startDownLoad();  

  36.                 //监听进度  

  37.                 listenProgress();  

  38.             }  

  39.         });  

  40.           

  41.     }  

  42.     /** 

  43.      * 监听进度,每秒钟获取调用MsgService的getProgress()方法来获取进度,更新UI 

  44.      */  

  45.     public void listenProgress(){  

  46.         new Thread(new Runnable() {  

  47.               

  48.             @Override  

  49.             public void run() {  

  50.                 while(progress < MsgService.MAX_PROGRESS){  

  51.                     progress = msgService.getProgress();  

  52.                     mProgressBar.setProgress(progress);  

  53.                     try {  

  54.                         Thread.sleep(1000);  

  55.                     } catch (InterruptedException e) {  

  56.                         e.printStackTrace();  

  57.                     }  

  58.                 }            

  59.             }  

  60.         }).start();  

  61.     }  

  62.       

  63.     ServiceConnection conn = new ServiceConnection() {  

  64.         @Override  

  65.         public void onServiceDisconnected(ComponentName name) {  

  66.               

  67.         }  

  68.           

  69.         @Override  

  70.         public void onServiceConnected(ComponentName name, IBinder service) {  

  71.             //返回一个MsgService对象  

  72.             msgService = ((MsgService.MsgBinder)service).getService();  

  73.               

  74.         }  

  75.     };  

  76.   

  77.     @Override  

  78.     protected void onDestroy() {  

  79.         unbindService(conn);  

  80.         super.onDestroy();  

  81.     }  

  82. }

下面用接口回调实现数据的传递,接口回调是很强大的数据传递方法,基本是一切数据你都可以用接口回调去处理,不让你陷入无法传递数据的烦恼中。

新建一个回调接口,这个接口可以建在被动的那个类中,也可以单独创建一个类专门用来写接口。

  1. public interface OnProgressListener {  

  2.     void onProgress(int progress);  

  3. }  

还是用上面的那个service类来做为demo

  1. package com.example.communication;  

  2.   

  3. import android.app.Service;  

  4. import android.content.Intent;  

  5. import android.os.Binder;  

  6. import android.os.IBinder;  

  7.   

  8. public class MsgService extends Service {  

  9.     /** 

  10.      * 进度条的最大值 

  11.      */  

  12.     public static final int MAX_PROGRESS = 100;  

  13.     /** 

  14.      * 进度条的进度值 

  15.      */  

  16.     private int progress = 0;  

  17.       

  18.     /** 

  19.      * 更新进度的回调接口 

  20.      */  

  21.     private OnProgressListener onProgressListener;   

  22.     /** 

  23.      * 注册回调接口的方法,供外部调用 

  24.      * @param onProgressListener 

  25.      */  

  26.     public void setOnProgressListener(OnProgressListener onProgressListener) {  

  27.         this.onProgressListener = onProgressListener;  

  28.     }  

  29.   

  30.     /** 

  31.      * 增加get()方法,供Activity调用 

  32.      * @return 下载进度 

  33.      */  

  34.     public int getProgress() {  

  35.         return progress;  

  36.     }  

  37.   

  38.     /** 

  39.      * 模拟下载任务,每秒钟更新一次 

  40.      */  

  41.     public void startDownLoad(){  

  42.         new Thread(new Runnable() {  

  43.               

  44.             @Override  

  45.             public void run() {  

  46.                 while(progress < MAX_PROGRESS){  

  47.                     progress += 5;  

  48.                       

  49.                     //进度发生变化通知调用方  

  50.                     if(onProgressListener != null){  

  51.                         onProgressListener.onProgress(progress);  

  52.                     }  

  53.                       

  54.                     try {  

  55.                         Thread.sleep(1000);  

  56.                     } catch (InterruptedException e) {  

  57.                         e.printStackTrace();  

  58.                     }              

  59.                 }  

  60.             }  

  61.         }).start();  

  62.     }  

  63.     /** 

  64.      * 返回一个Binder对象 

  65.      */  

  66.     @Override  

  67.     public IBinder onBind(Intent intent) {  

  68.         return new MsgBinder();  

  69.     }  

  70.       

  71.     public class MsgBinder extends Binder{  

  72.         /** 

  73.          * 获取当前Service的实例 

  74.          * @return 

  75.          */  

  76.         public MsgService getService(){  

  77.             return MsgService.this;  

  78.         }  

  79.     }  

  80. }

Activity中的代码如下

  1. package com.example.communication;  

  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.IBinder;  

  10. import android.view.View;  

  11. import android.view.View.OnClickListener;  

  12. import android.widget.Button;  

  13. import android.widget.ProgressBar;  

  14.   

  15. public class MainActivity extends Activity {  

  16.     private MsgService msgService;  

  17.     private ProgressBar mProgressBar;   

  18.     @Override  

  19.     protected void onCreate(Bundle savedInstanceState) {  

  20.         super.onCreate(savedInstanceState);  

  21.         setContentView(R.layout.activity_main);  

  22.            

  23.         //绑定Service  

  24.         Intent intent = new Intent("com.example.communication.MSG_ACTION");  

  25.         bindService(intent, conn, Context.BIND_AUTO_CREATE);  

  26.           

  27.           

  28.         mProgressBar = (ProgressBar) findViewById(R.id.progressBar1);  

  29.         Button mButton = (Button) findViewById(R.id.button1);  

  30.         mButton.setOnClickListener(new OnClickListener() {  

  31.               

  32.             @Override  

  33.             public void onClick(View v) {  

  34.                 //开始下载  

  35.                 msgService.startDownLoad();  

  36.             }  

  37.         });  

  38.           

  39.     }  

  40.     ServiceConnection conn = new ServiceConnection() {  

  41.         @Override  

  42.         public void onServiceDisconnected(ComponentName name) {  

  43.               

  44.         }  

  45.           

  46.         @Override  

  47.         public void onServiceConnected(ComponentName name, IBinder service) {  

  48.             //返回一个MsgService对象  

  49.             msgService = ((MsgService.MsgBinder)service).getService();    

  50.             //注册回调接口来接收下载进度的变化  

  51.             msgService.setOnProgressListener(new OnProgressListener() {             

  52.                 @Override  

  53.                 public void onProgress(int progress) {  

  54.                     mProgressBar.setProgress(progress);  

  55.                       

  56.                 }  

  57.             });       

  58.         }  

  59.     };  

  60.   

  61.     @Override  

  62.     protected void onDestroy() {  

  63.         unbindService(conn);  

  64.         super.onDestroy();  

  65.     }    

  66. }  

  • 通过(广播)的形式

当我们的进度发生变化的时候我们发送一条广播,然后在Activity的注册广播接收器,接收到广播之后更新ProgressBar,代码如下

  1. package com.example.communication;   

  2. import android.app.Activity;  

  3. import android.content.BroadcastReceiver;  

  4. import android.content.Context;  

  5. import android.content.Intent;  

  6. import android.content.IntentFilter;  

  7. import android.os.Bundle;  

  8. import android.view.View;  

  9. import android.view.View.OnClickListener;  

  10. import android.widget.Button;  

  11. import android.widget.ProgressBar;  

  12.   

  13. public class MainActivity extends Activity {  

  14.     private ProgressBar mProgressBar;  

  15.     private Intent mIntent;  

  16.     private MsgReceiver msgReceiver;  

  17.     @Override  

  18.     protected void onCreate(Bundle savedInstanceState) {  

  19.         super.onCreate(savedInstanceState);  

  20.         setContentView(R.layout.activity_main);  

  21.           

  22.         //动态注册广播接收器  

  23.         msgReceiver = new MsgReceiver();  

  24.         IntentFilter intentFilter = new IntentFilter();  

  25.         intentFilter.addAction("com.example.communication.RECEIVER");  

  26.         registerReceiver(msgReceiver, intentFilter);  

  27.           

  28.           

  29.         mProgressBar = (ProgressBar) findViewById(R.id.progressBar1);  

  30.         Button mButton = (Button) findViewById(R.id.button1);  

  31.         mButton.setOnClickListener(new OnClickListener() {  

  32.               

  33.             @Override  

  34.             public void onClick(View v) {  

  35.                 //启动服务  

  36.                 mIntent = new Intent("com.example.communication.MSG_ACTION");  

  37.                 startService(mIntent);  

  38.             }  

  39.         });  

  40.           

  41.     }     

  42.     @Override  

  43.     protected void onDestroy() {  

  44.         //停止服务  

  45.         stopService(mIntent);  

  46.         //注销广播  

  47.         unregisterReceiver(msgReceiver);  

  48.         super.onDestroy();  

  49.     }  

  50.   

  51.   

  52.     /** 

  53.      * 广播接收器 

  54.      * @author len 

  55.      * 

  56.      */  

  57.     public class MsgReceiver extends BroadcastReceiver{  

  58.   

  59.         @Override  

  60.         public void onReceive(Context context, Intent intent) {  

  61.             //拿到进度,更新UI  

  62.             int progress = intent.getIntExtra("progress"0);  

  63.             mProgressBar.setProgress(progress);  

  64.         }       

  65.     }  

  66. }  

  67. package com.example.communication;  

  68. import android.app.Service;  

  69. import android.content.Intent;  

  70. import android.os.IBinder;  

  71.   

  72. public class MsgService extends Service {  

  73.     /** 

  74.      * 进度条的最大值 

  75.      */  

  76.     public static final int MAX_PROGRESS = 100;  

  77.     /** 

  78.      * 进度条的进度值 

  79.      */  

  80.     private int progress = 0;  

  81.       

  82.     private Intent intent = new Intent("com.example.communication.RECEIVER"

  83.     /** 

  84.      * 模拟下载任务,每秒钟更新一次 

  85.      */  

  86.     public void startDownLoad(){  

  87.         new Thread(new Runnable() {  

  88.               

  89.             @Override  

  90.             public void run() {  

  91.                 while(progress < MAX_PROGRESS){  

  92.                     progress += 5;  

  93.                       

  94.                     //发送Action为com.example.communication.RECEIVER的广播  

  95.                     intent.putExtra("progress", progress);  

  96.                     sendBroadcast(intent);  

  97.                       

  98.                     try {  

  99.                         Thread.sleep(1000);  

  100.                     } catch (InterruptedException e) {  

  101.                         e.printStackTrace();  

  102.                     }  

  103.                       

  104.                 }  

  105.             }  

  106.         }).start();  

  107.     }  

  108.     @Override  

  109.     public int onStartCommand(Intent intent, int flags, int startId) {  

  110.         startDownLoad();  

  111.         return super.onStartCommand(intent, flags, startId);  

  112.     }  

  113.     @Override  

  114.     public IBinder onBind(Intent intent) {  

  115.         return null;  

  116.     }   

  117. }