zoukankan      html  css  js  c++  java
  • Android组件通讯之Service的基础绑定

    当一个Activity通过Intent绑定一个Service时,会调用Service的onBind方法。此方法会返回一个IBinder对象,此对象作为参数传递给Activity中定义好的ServiceConnection中的onServiceConnected()方法,使得Activity获取到Service的操作接口

    下面是一个例子,通过两个按钮来绑定和解绑一个Service,但是需要注意的是,如果当前没有绑定Service而直接解绑,会出现IllegalArgumentException,所以比较好的解决办法是使用一个标记接口判断绑定对象是否存在,具体见代码

    标记接口:

    //  我只是一个空接口
    public interface IService {}

    然后是我们自己的Service类:

     1 public class MyService extends Service {
     2     
     3     private MyBinder myBinder = new MyBinder();
     4     
     5     @Override
     6     public IBinder onBind(Intent intent) {
     7 System.out.println("**** onBind() ****");
     8         return myBinder;
     9     }
    10     
    11     @Override
    12     public void onCreate() {
    13 System.out.println("**** onCreate() ****");
    14         super.onCreate();
    15     }
    16 
    17     @Override
    18     public void onDestroy() {
    19 System.out.println("**** onDestroy() ****");
    20         super.onDestroy();
    21     }
    22 
    23     @Override
    24     public int onStartCommand(Intent intent, int flags, int startId) {
    25 System.out.println("**** onStartCommand() ****");
    26         return super.onStartCommand(intent, flags, startId);
    27     }
    28 
    29     @Override
    30     public void onRebind(Intent intent) {
    31 System.out.println("**** onRebind() ****");
    32         super.onRebind(intent);
    33     }
    34 
    35     @Override
    36     public boolean onUnbind(Intent intent) {
    37 System.out.println("**** onUnbind() ****");
    38         return super.onUnbind(intent);
    39     }
    40     
    41     // 注意! MyBinder为Binder与IService的共同子类
    42     class MyBinder extends Binder implements IService {}
    43     
    44 }

    Activity:

     1 public class MainActivity extends Activity {
     2     
     3     private Button bindServiceBtn = null;
     4     private Button unbindServiceBtn = null;
     5     private IService myService = null;
     6     
     7     // 实例化ServiceConnection接口用以处理绑定后Service传回的操作接口
     8     private ServiceConnection conn = new ServiceConnection() {
     9         
    10         @Override
    11         public void onServiceConnected(ComponentName name, IBinder service) {
    12             System.out.println("**** conn.onServiceConnected() ****");    
    13             // 此处实际上是参数service向下转型为MyBinder, 然后再向上转型为IService,若绑定成功,则IService对象不为空
    14             myService = (MyBinder) service;
    15         }
    16         
    17         @Override
    18         public void onServiceDisconnected(ComponentName name) {
    19             System.out.println("**** conn.onServiceDisconnected() ****");    
    20         }
    21         
    22     };
    23     
    24     @Override
    25     protected void onCreate(Bundle savedInstanceState) {
    26         super.onCreate(savedInstanceState);
    27         setContentView(R.layout.activity_main);
    28         
    29         bindServiceBtn = (Button) findViewById(R.id.bindServiceBtn);
    30         unbindServiceBtn = (Button) findViewById(R.id.unbindServiceBtn);
    31         
    32         bindServiceBtn.setOnClickListener(new BindServiceListener());
    33         unbindServiceBtn.setOnClickListener(new UnbindServiceListener());
    34         
    35     }
    36     
    37     private class BindServiceListener implements OnClickListener {
    38         @Override
    39         public void onClick(View v) {
    40             Intent intent = new Intent(MainActivity.this, MyService.class);
    41             MainActivity.this.bindService(intent, conn, Context.BIND_AUTO_CREATE);
    42         }
    43     }
    44     
    45     private class UnbindServiceListener implements OnClickListener {
    46         @Override
    47         public void onClick(View v) {
    48             // 判断IService是否为空,不为空才可解绑
    49             if (MainActivity.this.myService != null) {
    50                 MainActivity.this.unbindService(conn);
    51                 MainActivity.this.myService = null;
    52             } else {
    53                 Toast.makeText(MainActivity.this, "请绑定服务", Toast.LENGTH_SHORT).show();
    54             }
    55         }
    56     }
    57 
    58 }
  • 相关阅读:
    网络编程
    模块
    内置函数
    函数应用
    万能参数
    函数
    爬虫
    算法
    Flask
    linux
  • 原文地址:https://www.cnblogs.com/moka/p/3064280.html
Copyright © 2011-2022 走看看