android-service3

来源:互联网 发布:wow7.3mac系统 编辑:程序博客网 时间:2024/05/16 17:25

通过 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());@Overridepublic 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;}

}

0 0
原创粉丝点击