美文网首页
Messenger信使(跨进程通信)

Messenger信使(跨进程通信)

作者: 五万年前走丢了 | 来源:发表于2018-06-10 23:41 被阅读15次

    由Handler发送接收
    服务器
    Service
    public class MyService extends Service {
    public MyService() {
    }
    Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
    super.handleMessage(msg);
    Log.i("tagserver","--------从客户端传递的数据---------");
    Log.i("tagserver","what==="+msg.what+",arg1==="+msg.arg1+",arg2==="+msg.arg2);
    Messenger clientMessenger = msg.replyTo;

            Message message = Message.obtain();
            message.what = 2;
            message.arg1 = 999;
            message.arg2 = 8888;
    
            try {
                clientMessenger.send(message);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    };
    
    //创建服务器端信使对象
    Messenger serverMessenger = new Messenger(handler);
    @Override
    public IBinder onBind(Intent intent) {
        //通过getBinder的方法能够返回连接通道的对象,就是IBinder
        return serverMessenger.getBinder();
    }
    

    }
    清单注册

    <service
                android:name=".MyService"
                android:enabled="true"
                android:exported="true">
                <intent-filter>
                    <action android:name="com.qf.server"></action>
                </intent-filter>
            </service>
    
    客户端
    Mainactivity
    
    public class MainActivity extends AppCompatActivity {
    
        private Messenger serverMessenger;
        private Messenger clientMessenger;
    
        Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                Log.i("tagclient","----从服务器端传来的消息----");
                Log.i("tagclient","msg.what=="+msg.what+",arg===="+msg.arg1+",arg2----"+msg.arg2);
            }
        };
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            clientMessenger = new Messenger(handler);    //客户端的信使
        }
    //ServiceConnection是一个接口,继承和实现内部类都可以.
        ServiceConnection connection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                serverMessenger = new Messenger(service);    //服务端的信使
            }
            @Override
            public void onServiceDisconnected(ComponentName name) {
    
            }
        };
        //绑定服务的要求: 在android5.0之前,使用隐示和显示意图都可以,5.0之后,google官方建议不要使用隐式意图,
        //如果直接使用,会报错。
    
        @Override
        protected void onStart() {
            super.onStart();
            Intent intent = new Intent();
            intent.setAction("com.qf.server");
            //为了能够让5.0之后的版本,服务可以使用隐士意图必须要加上的语句
            // Service Intent must be explicit: Intent { act=com.qf.server }
            intent.setPackage("com.qianfeng.server");
            bindService(intent,connection,BIND_AUTO_CREATE);
        }
        public void onClick(View view) {
            Message message = Message.obtain();
            message.what = 1;
            message.arg1 = 98;
            message.arg2 = 100;
            message.replyTo = clientMessenger;
            try {
                serverMessenger.send(message);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    }
    

    布局

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.qianfeng.client.MainActivity">
    
        <Button
            android:id="@+id/btn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="向服务器发送消息"
            android:onClick="onClick"/>
    </RelativeLayout>
    

    相关文章

      网友评论

          本文标题:Messenger信使(跨进程通信)

          本文链接:https://www.haomeiwen.com/subject/jetceftx.html