首页 > 代码库 > Activity与Service进行数据交互

Activity与Service进行数据交互

Android启动Service有两种方法,一种是startService,一种是bindService。生命周期如下:

技术分享

 

执行startService时,调用者如果没有stopService,Service会一直在后台运行。多次调用startService,该Service只能被创建一次,即该Service的onCreate方法只会被调用一次。但是每次调用startService,onStartCommand方法都会被调用。

执行bindService时,调用者调用unbindService方法或者调用者Context不存在了(如Activity被finish了)。第一次执行bindService时,onCreate和onBind方法会被调用,但是多次执行bindService时,onCreate和onBind方法并不会被多次调用,即并不会多次创建服务和绑定服务。

既使用startService又使用bindService的情况,需要unbindService和stopService同时调用才会终止Service。

 

Activity与Service交互有两种方法:一种是使用broadcast,另一种是使用bindService。本文只介绍bindService方法。

 

 

 1 public class MsgService extends Service { 2     public MsgService() { 3     } 4  5     /** 6      * 进度条的最大值 7      */ 8     public static final int MAX_PROGRESS = 100; 9     /**10      * 进度条的进度值11      */12     private int progress = 0;13 14     /**15      * 增加get()方法,供Activity调用16      *17      * @return 下载进度18      */19     public int getProgress() {20         return progress;21     }22 23     /**24      * 模拟下载任务,每秒钟更新一次25      */26     public void startDownLoad(){27         new Thread(new Runnable() {28 29             @Override30             public void run() {31                 while(progress < MAX_PROGRESS){32                     progress += 5;33 34                     //进度发生变化通知调用方35                     if(onProgressListener != null){36                         onProgressListener.onProgress(progress);37                     }38 39                     try {40                         Thread.sleep(1000);41                     } catch (InterruptedException e) {42                         e.printStackTrace();43                     }44 45                 }46             }47         }).start();48     }49 50     @Override51     public IBinder onBind(Intent intent) {52         return new MyBinder();53     }54 55     public class MyBinder extends Binder {56         public MsgService getService() {57             return MsgService.this;58         }59     }60 61     public interface OnProgressListener {62         void onProgress(int progress);63     }64 65     /**66      * 更新进度的回调接口67      */68     private OnProgressListener onProgressListener;69 70 71     /**72      * 注册回调接口的方法,供外部调用73      *74      * @param onProgressListener75      */76     public void setOnProgressListener(OnProgressListener onProgressListener) {77         this.onProgressListener = onProgressListener;78     }79 80 }

 

public class MainActivity extends Activity {    private Button button19;    private MsgService msgService;    private int progress = 0;    private ProgressBar mProgressBar;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        btnExec = (Button) findViewById(R.id.btnExec);        button19 = (Button) findViewById(R.id.button19);        mProgressBar = (ProgressBar) findViewById(R.id.progressBar);        button19.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                msgService.startDownLoad();            }        });        Intent intent = new Intent(this, MsgService.class);        bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);    }    ServiceConnection mServiceConnection = new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {            msgService = ((MsgService.MyBinder) iBinder).getService();            msgService.setOnProgressListener(new MsgService.OnProgressListener() {                @Override                public void onProgress(int progress) {                    mProgressBar.setProgress(progress);                }            });        }        @Override        public void onServiceDisconnected(ComponentName componentName) {        }    };    @Override    protected void onDestroy() {        unbindService(mServiceConnection);        super.onDestroy();    }}

 

例子中,MsgService模拟耗时的下载任务,MainActivity 绑定服务,通过注册OnProgressListener回调获取下载进度,更新进度条。

 

本例子Activity和Service是在同一个进程中,对于跨进程调用Service需要使用到AIDL技术。

 

Activity与Service进行数据交互