android-service3

本文介绍如何利用Messenger实现Android应用中的跨进程通信。主要内容包括:创建服务端Service并配置,客户端连接服务端及双向消息传递的具体实现。

通过 Messenger实现service,可以实现两个进程直接通信。

一.创建 Service

public class MyService_message extends Service{
public static final int MSGID=1;

/**
 * 用于接收从客户端传递过来的数据
 */
private class ServiceMessage extends Handler {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what)
        {
            case MSGID:
                Log.e("MyService_message","服务器接收客户端的消息");
                Messenger messenger=msg.replyTo;
                try {
                      messenger.send(Message.obtain(null,10,"服务器回传的数据10"));
                  } catch (RemoteException e) {
                }
                break;
            default:
                super.handleMessage(msg);
        }
    }
}
final  Messenger msg=new Messenger(new ServiceMessage());
@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
   // throw new UnsupportedOperationException("Not yet implemented");
    Log.e("MyService_message","onBind");
   return msg.getBinder();
}
}
二.配置service
<service
    android:name=".Service.MyService_message"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="com.example.administrator.servicetest.Service.MyService_message.action"></action>
    </intent-filter>
</service>

三.创建客户端
  
1.开始service 

  connection=new ServiceConnection() {
  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
      Log.e(TAG,"onServiceConnected");
      msg=new Messenger(service);//获取服务器的 Messenger 对象
  }

  @Override
  public void onServiceDisconnected(ComponentName name) {
      Log.e(TAG,"onServiceDisconnected");
      msg=null;
  }
};


    
  //--------------------隐式调用------------------------------
   Intent intent=new Intent();
   intent.setAction("com.example.administrator.servicetest.Service.MyService_message.action");
   //android 5.0之后不支持直接隐式调用需要加下面这一行,或者把隐式转换成显示
   intent.setPackage(context.getPackageName());
 //--------------------------------------------------
//-----------------------把隐式转显示-----------------------------------
     Intent intent=new Intent();
     intent.setAction("com.example.administrator.servicetest.Service.MyService_message.action");
     intent=getExplicitIntent(context,intent);
//-----------------------------------------------------------
context.bindService(intent,connection ,Service.BIND_AUTO_CREATE);
2.停止service
context.unbindService(connection);

3.给服务器发送消息进行通信
   Message mess=new Message();
   mess.what=MyService_message.MSGID;
   mess.replyTo=messenger;
   msg.send(mess);
private  Messenger messenger=new Messenger(new receive());
private class receive extends Handler{
    @Override
    public void handleMessage(Message msg) {
      //  super.handleMessage(msg);
        switch (msg.what){
            case 10:
                Log.e(TAG,"客户端接收服务器的数据:"+msg.obj);
                break;
        }
    }
}

public static Intent getExplicitIntent(Context context, Intent implicitIntent) {
    // Retrieve all services that can match the given intent
    PackageManager pm = context.getPackageManager();
    List<ResolveInfo> resolveInfo = pm.queryIntentServices(implicitIntent, 0);
    // Make sure only one match was found
    if (resolveInfo == null || resolveInfo.size() != 1) {
        return null;
    }
    // Get component info and create ComponentName
    ResolveInfo serviceInfo = resolveInfo.get(0);
    String packageName = serviceInfo.serviceInfo.packageName;
    String className = serviceInfo.serviceInfo.name;
    ComponentName component = new ComponentName(packageName, className);
    // Create a new intent. Use the old one for extras and such reuse
    Intent explicitIntent = new Intent(implicitIntent);
    // Set the component to be explicit
    explicitIntent.setComponent(component);
    return explicitIntent;
}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值