zoukankan      html  css  js  c++  java
  • Service(二):通信

         课程:http://www.jikexueyuan.com/course/715_3.html?ss=1

         在activity和service之间通信。

         首先使用的是启动服务来通信。注意是如何使用Intent取得EditText的数据并传递给service的,在service是又是如何取出数据的。

        在MainActivity中

     private EditText etData;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            etData = (EditText)findViewById(R.id.etData);
    
            findViewById(R.id.btnStartService).setOnClickListener(this);
            findViewById(R.id.btnStopService).setOnClickListener(this);
        }
    
     public void onClick(View v) {
            switch (v.getId()){
                case R.id.btnStartService:
                    Intent i = new Intent(this,MyService.class);
                    i.putExtra("data",etData.getText().toString());
                    startService(i);
                    break;
                case R.id.btnStopService:
                    stopService(new Intent(this,MyService.class));
                    break;
            }
        }
    View Code

        在MyService中,通过启动服务的onCommand来取得数据

      

     public int onStartCommand(Intent intent, int flags, int startId) {
    
            data = intent.getStringExtra("data");
    
            return super.onStartCommand(intent, flags, startId);
        }
    View Code

      接下来用绑定服务来完成通信。

      增加两个绑定按钮和一个数据同步按钮

      

    case R.id.btnBindService:
                    bindService(new Intent(this,MyService.class),this, Context.BIND_AUTO_CREATE);
                    break;
                case R.id.btnUnbindService:
                    unbindService(this);
                    break;
                case R.id.btnSyncData:
                    if(binder!=null){
                        binder.setData(etData.getText().toString());
    View Code

      在绑定服务中需完成两个函数

     @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
    
            binder = (MyService.Binder)service;
        }
    
        @Override
        public void onServiceDisconnected(ComponentName name) {
    
        }
    View Code

     其中的binder悄悄完成了activiy和service之间的通信(这里面的过程很微妙,好好体会)

     public IBinder onBind(Intent intent) {
    
            return new Binder();
        }
    
        public class Binder extends android.os.Binder{
    
            public void setData(String data){
    
                MyService.this.data = data;
            }
        }
    View Code

     总结下启动服务和绑定服务与活动通信的不同:

     启动服务是通过Intent对象来取得数据,通过startService启动onStartCommand来过多成Intent对象的传递。

     绑定服务是通过binder对象中的函数来完成通信。

    前面讲的是从activity中获取数据到MyService,即从UI线程(主线程)从获取数据到子线程中,那么如何总子线程中获取数据到主线程中呢

    示例中在子线程中完成数据的变化,要求将其显示在UI的TextView上。

    这里用到了回调的方式。首先定交一个接口CallBack用于向UI中传递变化的数据,在activity中实现接口中的函数,取得数据,并以message的方式传递给Handler,再将其传递给TextView进行显示。

    这个过程还是挺复杂的,需要细心体会。

  • 相关阅读:
    js中call,apply,bind方法的用法
    使用react脚手架初始化一个项目
    常用的CSS居中方式
    react组件之间的通信
    React脚手架less的安装
    js操作DOM的方法
    常用的ement语法
    本机系统通过SSH访问虚拟机中的Linux系统
    Java_amr格式转mp3
    linux/ubantu 安装 mysql 并且使其支持远程连接
  • 原文地址:https://www.cnblogs.com/573177885qq/p/4876124.html
Copyright © 2011-2022 走看看