Service启动方式之bindService

   “迷津欲有问,平海夕漫漫。”在未来的开发道路中,我们要刻苦钻研,用心去研究理论知识,只有树立远大的目标(架构师)我们才有一个动力。
一、使用场景

  1. 在同个app之间调用(即是同一个进程中)
  2. 在不同app之间调用(即是跨进程间通信)

注意:进程和线程的关系(阅读我的博客文章Java基础:http://blog.csdn.net/join_xiao/article/details/79097933)

二、代码示例
  • 同个app间调用(该服务只启动一次
    • activity界面代码
      public class BinderActivityA extends AppCompatActivity implements View.OnClickListener {
          private Button btn1;
          private Button btn2;
          private Button btn3;
          private Button btn4;
          private BindService bindService = null;
          private boolean isBound = false;
      
          private ServiceConnection conn = new ServiceConnection() {
      
              @Override
              public void onServiceConnected(ComponentName name, IBinder service) {
                  isBound = true;
                  BindService.MyBinder binder = (BindService.MyBinder) service;
                  bindService = binder.getService();
                  int num = bindService.getRandomNumber();
                  Log.v("test","numA="+num);
              }
      
              //client 和service连接意外丢失时,会调用该方法  
              @Override
              public void onServiceDisconnected(ComponentName name) {
                  Log.v("test","onServiceDisconnected  A");
              }
          };
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_binder_acticity);
              findLayoutView();
              setLister();
              initData();
      
          }
      
          private void findLayoutView() {
              btn1 = (Button) findViewById(R.id.btn1);
              btn2 = (Button) findViewById(R.id.btn2);
              btn3 = (Button) findViewById(R.id.btn3);
              btn4 = (Button) findViewById(R.id.btn4);
          }
      
          private void setLister() {
              btn1.setOnClickListener(this);
              btn2.setOnClickListener(this);
              btn3.setOnClickListener(this);
              btn4.setOnClickListener(this);
          }
      
          private void initData() {
      
          }
      
          @Override
          public void onClick(View v) {
              Intent intent = null;
              switch (v.getId()){
                  case R.id.btn1:
                      intent = new Intent(BinderActivityA.this, BindService.class);
                      intent.putExtra("from", "ActivityA");
                      bindService(intent,conn,BIND_AUTO_CREATE);
                      break;
                  case R.id.btn2:
                      if (isBound){
                          isBound = false;
                          Log.v("test","ActicityA is unbindService");
                          unbindService(conn);
                      }
                      break;
                  case R.id.btn3:
                      intent = new Intent(this, BinderActivityB.class);
                      startActivity(intent);
                      break;
                  case R.id.btn4:
                      this.finish();
                      break;
              }
          }
      
          @Override
          protected void onDestroy() {
              super.onDestroy();
              Log.i("test", "ActivityA -> onDestroy");
          }
    • service代码
      public class BindService extends Service {
          public class MyBinder extends Binder {
      
              public BindService getService(){
                  return BindService.this;
              }
          }
          //通过binder实现了 调用者(client)与 service之间的通信
          private MyBinder binder = new MyBinder();
      
          private final Random generator = new Random();
      
          @Override
          public void onCreate() {
              super.onCreate();
              Log.i("test","BindService -> onCreate, Thread: " + Thread.currentThread().getName());
          }
      
          @Override
          public IBinder onBind(Intent intent) {
              Log.i("test", "BindService -> onBind, Thread: " + Thread.currentThread().getName());
              return binder;
          }
      
          @Override
          public boolean onUnbind(Intent intent) {
              Log.i("test", "BindService -> onUnbind, from:" + intent.getStringExtra("from"));
              return false;
          }
      
          @Override
          public int onStartCommand(Intent intent, int flags, int startId) {
              Log.i("test", "BindService -> onStartCommand, startId: " + startId + ", Thread: " + Thread.currentThread().getName());
              return START_NOT_STICKY;
          }
      
          @Override
          public void onDestroy() {
              Log.i("test", "BindService -> onDestroy, Thread: " + Thread.currentThread().getName());
              super.onDestroy();
          }
      
          //在Service中暴露出去的方法,供client调用
          public int getRandomNumber(){
              return generator.nextInt();
          }
      }


  • 同个app间调用(该服务只启动多次
  • public class BinderActivityB extends Activity implements View.OnClickListener {  
        private Button btn1;  
        private Button btn2;  
        private Button btn4;  
      
        private BindService bindService = null;  
        private boolean isBound = false;  
      
        private ServiceConnection conn = new ServiceConnection() {  
      
            @Override  
            public void onServiceConnected(ComponentName name, IBinder service) {  
                isBound = true;  
                BindService.MyBinder binder = (BindService.MyBinder) service;  
                bindService = binder.getService();  
                int num = bindService.getRandomNumber();  
                Log.v("hjz","numB="+num);  
            }  
      
            @Override  
            public void onServiceDisconnected(ComponentName name) {  
                Log.v("hjz","onServiceDisconnected  B");  
            }  
        };  
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_binder_b);  
            findLayoutView();  
            setLister();  
            initData();  
      
        }  
      
        private void findLayoutView() {  
            btn1 = (Button) findViewById(R.id.btn1);  
            btn2 = (Button) findViewById(R.id.btn2);  
            btn4 = (Button) findViewById(R.id.btn4);  
        }  
      
        private void setLister() {  
            btn1.setOnClickListener(this);  
            btn2.setOnClickListener(this);  
            btn4.setOnClickListener(this);  
        }  
      
        private void initData() {  
      
        }  
      
        @Override  
        public void onClick(View v) {  
            Intent intent = null;  
            switch (v.getId()){  
                case R.id.btn1:  
                    intent = new Intent(BinderActivityB.this, BindService.class);  
                    intent.putExtra("from", "ActivityB");  
                    bindService(intent,conn,BIND_AUTO_CREATE);  
                    break;  
                case R.id.btn2:  
                    if (isBound){  
                        isBound = false;  
                        Log.v("hjz","ActicityB is unbindService");  
                        unbindService(conn);  
                    }  
                    break;  
                case R.id.btn4:  
                    this.finish();  
                    break;  
            }  
        }  
      
        @Override  
        protected void onDestroy() {  
            super.onDestroy();  
            Log.i("hjz", "ActivityB -> onDestroy");  
        }  
    }  
    我们进行分析可得出如下流程图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值