4、startService 启动服务
想要用 startService 启动服务,不管Local 还是 Remote 我们需要做的工作都是一样简单。当然要记得在 Androidmanifest.xml 中注册 service。
根据上面的生命周期,我们便会给出 Service 中的代码框架:
 
package com.newcj.test; import android.app.Service;import android.content.Intent;import android.os.IBinder; public class LocalService1 extends Service {         /**         * onBind 是 Service 的虚方法,因此我们不得不实现它。         * 返回 null,表示客服端不能建立到此服务的连接。         */        @Override        public IBinder onBind(Intent intent) {                return null;        }                 @Override        public void onCreate() {                super.onCreate();        }                 @Override        public void onStart(Intent intent, int startId) {                super.onStart(intent, startId);        }                 @Override        public void onDestroy() {                super.onDestroy();        } }
 
对应生命周期系统回调函数上面已经说明,在对应地方加上适当的代码即可。下面是启动与停止 Service 的代码:
 
// 启动一个 ActivitystartActivity(new Intent(this, LocalService1.class));...// 停止一个 ActivitystopService(new Intent(this, LocalService1.class));
 
 
对应的 Intent 为标志服务类的 Intent。
 
 
5、Local 与 Remote 服务绑定
同样记得在 Androidmanifest.xml 中注册 service
1). Local 服务绑定:Local 服务的绑定较简单,首先在 Service 中我们需要实现 Service 的抽象方法 onBind,并返回一个实现 IBinder 接口的对象。
Service 中的代码:
 
 
package com.newcj.test; import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder; public class LocalService extends Service {         /**         * 在 Local Service 中我们直接继承 Binder 而不是 IBinder,因为 Binder 实现了 IBinder 接口,这样我们可以少做很多工作。         * @author newcj         */        public class SimpleBinder extends Binder{                /**                 * 获取 Service 实例                 * @return                 */                public LocalService getService(){                        return LocalService.this;                }                                 public int add(int a, int b){                        return a + b;                }        }                 public SimpleBinder sBinder;                 @Override        public void onCreate() {                super.onCreate();                // 创建 SimpleBinder                sBinder = new SimpleBinder();        }                 @Override        public IBinder onBind(Intent intent) {                // 返回 SimpleBinder 对象                return sBinder;        } }
 
上面的代码关键之处,在于 onBind(Intent) 这个方法 返回了一个实现了 IBinder 接口的对象,这个对象将用于绑定Service 的 Activity 与 Local Service 通信。下面是 Activity 中的代码:
 
package com.newcj.test; 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.IBinder;import android.util.Log;import android.view.View;import android.view.View.OnClickListener; public class Main extends Activity {        private final static String TAG = "SERVICE_TEST";        private ServiceConnection sc;        private boolean isBind;         @Override        public void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                setContentView(R.layout.main);                sc = new ServiceConnection() {                                                 @Override                        public void onServiceDisconnected(ComponentName name) {                         }                                                 @Override                        public void onServiceConnected(ComponentName name, IBinder service) {                                LocalService.SimpleBinder sBinder = (LocalService.SimpleBinder)service;                                Log.v(TAG, "3 + 5 = " + sBinder.add(3, 5));                                Log.v(TAG, sBinder.getService().toString());                        }                };                findViewById(R.id.btnBind).setOnClickListener(new OnClickListener() {                                                 @Override                        public void onClick(View v) {                                bindService(new Intent(Main.this, LocalService.class), sc, Context.BIND_AUTO_CREATE);                                isBind = true;                        }                });                findViewById(R.id.btnUnbind).setOnClickListener(new OnClickListener() {                                                 @Override                        public void onClick(View v) {                                if(isBind){                                        unbindService(sc);                                        isBind = false;                                }                        }                });        }}
 
 
 
在 Activity 中,我们通过 ServiceConnection 接口来取得建立连接 与 连接意外丢失的回调。bindService有三个参数,第一个是用于区分 Service 的Intent 与 startService 中的 Intent 一致,第二个是实现了 ServiceConnection 接口的对象,最后一个是 flag 标志位。有两个flag,BIND_DEBUG_UNBIND 与 BIND_AUTO_CREATE,前者用于调试(详细内容可以查看javadoc 上面描述的很清楚),后者默认使用。unbindService 解除绑定,参数则为之前创建的 ServiceConnection 接口对象。另外,多次调用 unbindService 来释放相同的连接会抛出异常,因此我创建了一个 boolean 变量来判断是否 unbindService 已经被调用过。
运行结果:
2). Remote 服务绑定:Remote 的服务绑定由于服务是在另外一个进程,因此需要用到 android 的 IPC 机制。这将又是一个很长的话题,因此,我打算写另外一篇 android 的 IPC 机制分析 ,并在其中进行详述,然后在这里更新链接,敬请关注。
特别注意:
1、Service.onBind如果返回null,则调用 bindService 会启动 Service,但不会连接上 Service,因此 ServiceConnection.onServiceConnected 不会被调用,但你任然需要使用 unbindService 函数断开它,这样 Service 才会停止。