Android Activity 怎么和Service 绑定?

发布于 2020-01-11 22:52:40
关注者
0
被浏览
3858
1 个回答
  • 面试哥
    面试哥 2020-01-11
    为面试而生,有面试问题,就找面试哥。

    这需要实现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的优先级。

知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看