下面是平时学习中对Service的一些总结

​http://note.youdao.com/yws/public/redirect/share?id=703f6407ff7a08bccb8ccd8cc7a1a107&type=false​

​http://note.youdao.com/yws/public/redirect/share?id=f5ce1c8a6fae5cc0335c4dbb946fae84&type=false​

Messenger使用代码:

1.先创建一个远程服务

public class MessengerService extends Service {
private static final int MSG_SUM = 0x110;
public MessengerService() {
}

Messenger messenger = new Messenger(new Handler(){
@Override
public void handleMessage(Message msgfromclient) {
super.handleMessage(msgfromclient);
//根据客户端发过来的消息创建一个message对象
Message msgtoclient = Message.obtain(msgfromclient);
switch (msgfromclient.what){
case MSG_SUM:
msgtoclient.what = MSG_SUM;
try {
Thread.sleep(2000);
msgtoclient.arg2 = msgfromclient.arg1 + msgfromclient.arg2;
//向客户端发送消息,replyto方法获得一个messenger对象
msgfromclient.replyTo.send(msgtoclient);
}catch (RemoteException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
}
}
});
@Override
public IBinder onBind(Intent intent) {
//获得binder对象
return messenger.getBinder();
}
}

同时要在清单文件注册,注意加上动作

<service
android:name=".MessengerService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.lxn.add"/>
</intent-filter>
</service>

然后我们创建客户端,

private static final String TAG = "MainActivity";
private static final int MSG_SUM = 0x110;
boolean isBound = false;
private Button mBtnAdd;
private LinearLayout mLyContainer;
//显示连接状态
private TextView mTvState;
private int mA;
private Messenger mService;
private Messenger messenger = new Messenger(new Handler(){
@Override
public void handleMessage(Message msgFromServer) {
super.handleMessage(msgFromServer);
switch (msgFromServer.what){
case MSG_SUM:
TextView tv = (TextView) mLyContainer.findViewById(msgFromServer.arg1);
tv.setText(tv.getText() + "=>" + msgFromServer.arg2);
break;
}
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTvState = (TextView) findViewById(R.id.id_tv_callback);
mBtnAdd = (Button) findViewById(R.id.id_btn_add);
mLyContainer = (LinearLayout) findViewById(R.id.id_ll_container);
invokeBindService();
mBtnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int a = mA++;
int b = (int) (Math.random()*100);
TextView textview = new TextView(MainActivity.this);
textview.setText(a + " + " + b + " = caculating ...");
textview.setId(a);
mLyContainer.addView(textview);

Message msgfromclient = Message.obtain(null, MSG_SUM, a, b);
msgfromclient.replyTo = messenger;
if(isBound){
try {
mService.send(msgfromclient);//向服务器发消息
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
}

private void invokeBindService() {
Intent intent = new Intent();
//绑定服务,远程服务必须指定action
intent.setAction("com.lxn.add");
bindService(intent,conn,BIND_AUTO_CREATE);
}

ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = new Messenger(service);
isBound = true;
mTvState.setText("connected");
}

@Override
public void onServiceDisconnected(ComponentName name) {
isBound = false;
mService = null;
mTvState.setText("disconnected");
}
};

@Override
protected void onDestroy() {
super.onDestroy();
if(isBound){
unbindService(conn);
isBound = false;
}
}
}