• Activity与Service通信的方式有三种:


    在博客园看到的,看着挺不错的,借来分享下

    继承Binder类

      这个方式仅仅有当你的Acitivity和Service处于同一个Application和进程时,才干够用,比方你后台有一个播放背景音乐的Service,这时就能够用这样的方式来进行通信。

    用样例来说明其用法:

      1. 来看Service的写法:

    public class LocalService extends Service {  
        // 实例化自己定义的Binder类  
        private final IBinder mBinder = new LocalBinder();  
        // 随机数的生成器  
        private final Random mGenerator = new Random();  
      
        /** 
         * 自己定义的Binder类,这个是一个内部类,所以能够知道其外围类的对象,通过这个类,让Activity知道其Service的对象 
         */  
        public class LocalBinder extends Binder {  
            LocalService getService() {  
                // 返回Activity所关联的Service对象,这样在Activity里,就可调用Service里的一些公用方法和公用属性  
                return LocalService.this;  
            }  
        }  
      
        @Override  
        public IBinder onBind(Intent intent) {  
            return mBinder;  
        }  
      
        /** public方法,Activity能够进行调用 */  
        public int getRandomNumber() {  
          return mGenerator.nextInt(100);  
        }  
    }  

    在Service里定义一个内部类,Binder的子类,通过这个类,把Service的对象传给Activity,这样Activity就能够调用Service里的公用方法和公用属性了,但这样的方式,一定要在同一个进程和同一个Application里。
       2. 再看对应Activity的代码:

    public class BindingActivity extends Activity {  
        LocalService mService;  
        boolean mBound = false;  
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
        }  
      
        @Override  
        protected void onStart() {  
            super.onStart();  
            // 绑定Service,绑定后就会调用mConnetion里的onServiceConnected方法  
            Intent intent = new Intent(this, LocalService.class);  
            bindService(intent, mConnection, Context.BIND_AUTO_CREATE);  
        }  
      
        @Override  
        protected void onStop() {  
            super.onStop();  
            // 解绑Service,这样能够节约内存  
            if (mBound) {  
                unbindService(mConnection);  
                mBound = false;  
            }  
        }  
      
        /** 用户点击button,就读取Service里的随机数 */  
        public void onButtonClick(View v) {  
            if (mBound) {  
                // 用Service的对象,去读取随机数  
                int num = mService.getRandomNumber();  
                Toast.makeText(this, "number: " + num, Toast.LENGTH_SHORT).show();  
            }  
        }  
      
        /** 定交ServiceConnection,用于绑定Service的*/  
        private ServiceConnection mConnection = new ServiceConnection() {  
      
            @Override  
            public void onServiceConnected(ComponentName className,  
                    IBinder service) {  
                // 已经绑定了LocalService,强转IBinder对象,调用方法得到LocalService对象  
                LocalBinder binder = (LocalBinder) service;  
                mService = binder.getService();  
                mBound = true;  
            }  
      
            @Override  
            public void onServiceDisconnected(ComponentName arg0) {  
                mBound = false;  
            }  
        };  
    }  
    

    这里就是通过IBinder来得到LocalService对象,再去调用其Public方法。

    使用Messenger

       上面的方法仅仅能在同一个进程里才干用,假设要与另外一个进程的Service进行通信,则能够用Messenger。

        事实上实现IPC的方式,还有AIDL,但推荐使用Messenger,有两点优点:

          1. 使用Messenger方式比使用AIDL的方式,实现起来要简单非常多

          2. 使用Messenger时,全部从Activity传过来的消息都会排在一个队列里,不会同一时候请求Service,所以是线程安全的。假设你的程序就是要多线程去訪问Service,就能够用AIDL,不然最好使用Messenger的方式。

      只是,事实上Messenger底层用的就是AIDL实现的,看一下实现方式,先看Service的代码:

    public class MessengerService extends Service {  
        /** 用于Handler里的消息类型 */  
        static final int MSG_SAY_HELLO = 1;  
      
        /** 
         * 在Service处理Activity传过来消息的Handler 
         */  
        class IncomingHandler extends Handler {  
            @Override  
            public void handleMessage(Message msg) {  
                switch (msg.what) {  
                    case MSG_SAY_HELLO:  
                        Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT).show();  
                        break;  
                    default:  
                        super.handleMessage(msg);  
                }  
            }  
        }  
      
        /** 
         * 这个Messenger能够关联到Service里的Handler,Activity用这个对象发送Message给Service,Service通过Handler进行处理。 
         */  
        final Messenger mMessenger = new Messenger(new IncomingHandler());  
      
        /** 
         * 当Activity绑定Service的时候,通过这种方法返回一个IBinder,Activity用这个IBinder创建出的Messenger,就能够与Service的Handler进行通信了 
         */  
        @Override  
        public IBinder onBind(Intent intent) {  
            Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show();  
            return mMessenger.getBinder();  
        }  
    }  

    Activity代码实现

    public class ActivityMessenger extends Activity {  
        /** 向Service发送Message的Messenger对象 */  
        Messenger mService = null;  
      
        /** 推断有没有绑定Service */  
        boolean mBound;  
      
        private ServiceConnection mConnection = new ServiceConnection() {  
            public void onServiceConnected(ComponentName className, IBinder service) {  
                // Activity已经绑定了Service  
                // 通过參数service来创建Messenger对象,这个对象能够向Service发送Message,与Service进行通信  
                mService = new Messenger(service);  
                mBound = true;  
            }  
      
            public void onServiceDisconnected(ComponentName className) {  
                mService = null;  
                mBound = false;  
            }  
        };  
      
        public void sayHello(View v) {  
            if (!mBound) return;  
            // 向Service发送一个Message  
            Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0);  
            try {  
                mService.send(msg);  
            } catch (RemoteException e) {  
                e.printStackTrace();  
            }  
        }  
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
        }  
      
        @Override  
        protected void onStart() {  
            super.onStart();  
            // 绑定Service  
            bindService(new Intent(this, MessengerService.class), mConnection,  
                Context.BIND_AUTO_CREATE);  
        }  
      
        @Override  
        protected void onStop() {  
            super.onStop();  
            // 解绑  
            if (mBound) {  
                unbindService(mConnection);  
                mBound = false;  
            }  
        }  
    }  

     注意:以上写的代码仅仅能实现从Activity向Service发送消息,假设想从Service向Activity发送消息,仅仅要把代码反过来写就能够了。

     

    使用AIDL

      这种方法略,假设知道上面两种方法,这种方法基本非常少会用到。




  • 相关阅读:
    HarmonyOS(鸿蒙OS)发布,聊聊操作系统的调度
    HarmonyOS(鸿蒙OS)发布,聊聊操作系统的调度
    修改SQL Server Management Studio 默认设置从而提高开发效率
    修改SQL Server Management Studio 默认设置从而提高开发效率
    还原默认的 SQL Server Management Studio 配置
    SQL2008智能提示失效
    SQL2008智能提示失效
    1028:字符菱形
    1028:字符菱形
    1027:输出浮点数
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3995189.html
Copyright © 2020-2023  润新知