Android Activity 怎么和Service 绑定?
-
这需要实现service中的onBind()函数以返回service实例给activity
1、创建service类和activity类。
2、在service类中定义一个内部类继承自Binder()类:
public class MyBinder extends Binder{ public Service1 getService(){ return Service1.this; } }
实例化onBind()方法:
private final IBinder binder = new MyyBinder(); @Override public IBinder onBind(Intent intent){ Log.i(LOG,"onBind......"); return binder; }
3、在activity中完成绑定
Intent intent = new Intent(Activity1.this,Activity2.class); bindService(intent,conn,Context.BIND_AUTO_CREATE);
bindService的第二个参数是一个ServiceConnection类型的参数。service和其他组件之间的连接都表示为一个ServiceConnection,要想将service和其他组件进行绑定,就需要实现一个新的ServiceConnection。
public ServiceConnection conn= new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { //当连接意外断开时调用 Log.i(LOG, "onServiceDisconnected>>>>>>>>"); myservice = null; } @Override public void onServiceConnected(ComponentName name, IBinder service) { //当建立连接时调用 Log.i(LOG, "onServiceConnected>>>>>>>>"); myservice = ((Service1.MyBinder)service).getService(); } };
bindService的第三个参数是一个flag。 可以使用的flag有:
BIND_AUTO_CREATE:绑定完成后就启动目标service
BIND_DEBUG_UNBIND:这只在debug时使用,跟unbind有关。
BIND_NOT_FOREGROUND:确保被绑定的service永远不会有运行于前台的优先级,因为默认情况下,绑定一个service会提高它的优先级
BIND_ABOVE_CLIENT:确保客户端处于前台时,绑定的service也变为前台进程
BIND_ALLOW_OOM_MANAGEMENT:允许系统在低内存等状态下删除该service(这是自己对源码中注释的理解)
BIND_WAIVE_PRIORITY:绑定service时不改变其优先级
BIND_ADJUST_WITH_ACTIVITY:系统根据service所绑定的activity的重要程度来调整这个service的优先级。