android="
package="com.ispring2.serviceapp">
android:
allowBackup="true"
android:
icon="@drawable/ic_launcher"
android:
label="ServiceApp">
android:
name=".MyService"
android:
enabled="true"
android:
exported="true">
name="com.ispring2.action.MYSERVICE"/>
name="android.intent.category.DEFAULT"/>
我们在ServiceApp的manifest.xml文件中注册了MyService,并通过exported=”true”将其声明为可被其他App调用的。
需要注意的是,我们将其action设置为自定义的action(com.ispring2.action.MYSERVICE),这是为了方便客户端通过其action启动MyService。
并且我们将其设置了值为android.intent.category.DEFAULT的category。
ServiceApp中MyService的代码如下所示:
packagecom.ispring2.serviceapp;
importandroid.app.Service;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.IBinder;
importandroid.os.Message;
importandroid.os.Messenger;
importandroid.os.RemoteException;
importandroid.util.Log;
publicclassMyServiceextendsService{
privatestaticfinalintRECEIVE_MESSAGE_CODE=0x0001;
privatestaticfinalintSEND_MESSAGE_CODE=0x0002;
//clientMessenger表示的是客户端的Messenger,可以通过来自于客户端的Message的replyTo属性获得,
//其内部指向了客户端的ClientHandler实例,可以用clientMessenger向客户端发送消息
privateMessengerclientMessenger=null;
//serviceMessenger是Service自身的Messenger,其内部指向了ServiceHandler的实例
//客户端可以通过IBinder构建Service端的Messenger,从而向Service发送消息,
//并由ServiceHandler接收并处理来自于客户端的消息
privateMessengerserviceMessenger=newMessenger(newServiceHandler());
//MyService用ServiceHandler接收并处理来自于客户端的消息
privateclassServiceHandlerextendsHandler{
@Override
publicvoidhandleMessage(Messagemsg){
Log.i("DemoLog","ServiceHandler->handleMessage");
if(msg.what==RECEIVE_MESSAGE_CODE){
Bundledata=msg.getData();
if(data!
=null){
Stringstr=data.getString("msg");
Log.i("DemoLog","MyService收到客户端如下信息:
"+str);
}
//通过Message的replyTo获取到客户端自身的Messenger,
//Service可以通过它向客户端发送消息
clientMessenger=msg.replyTo;
if(clientMessenger!
=null){
Log.i("DemoLog","MyService向客户端回信");
MessagemsgToClient=Message.obtain();
msgToClient.what=SEND_MESSAGE_CODE;
//可以通过Bundle发送跨进程的信息
Bundlebundle=newBundle();
bundle.putString("msg","你好,客户端,我是MyService");
msgToClient.setData(bundle);
try{
clientMessenger.send(msgToClient);
}catch(RemoteExceptione){
e.printStackTrace();
Log.e("DemoLog","MyService向客户端发送信息失败:
"+e.getMessage());
}
}
}
}
}
@Override
publicvoidonCreate(){
Log.i("DemoLog","MyService->onCreate");
super.onCreate();
}
@Override
publicIBinderonBind(Intentintent){
Log.i("DemoLog","MyServivce->onBind");
//获取Service自身Messenger所对应的IBinder,并将其发送共享给所有客户端
returnserviceMessenger.getBinder();
}
@Override
publicvoidonDestroy(){
Log.i("DemoLog","MyService->onDestroy");
clientMessenger=null;
super.onDestroy();
}
}
MyService中有一个内部类ServiceHandler,继承自Hanlder并重写了handleMessage方法,MyService用ServiceHandler接收并处理来自于客户端的消息。
MyService中,我们用ServiceHandler的实例初始化了serviceMessenger。
serviceMessenger是Service自身的Messenger,其内部指向了ServiceHandler的实例,客户端可以通过IBinder构建Service端的Messenger,从而向Service发送消息,并由ServiceHandler接收并处理来自于客户端的消息。
客户端代码
客户端应用ClientApp就一个MainActivity,其界面上就只有两个按钮:
bindService和unbindService,界面如下:
代码如下所示:
packagecom.ispring.clientapp;
importandroid.app.Activity;
importandroid.content.C