MainActivity
public class MainActivity extends AppCompatActivity {
/*
标记是否已经绑定Service。
Marking whether the service has been bound.
*/
private boolean bServiceConnected;
/*
这个Messenger用于向Service发送Message。
This Messenger is used to send message to service.
*/
private Messenger mSendMessenger;
/*
这个Messenger用于接收服务器发送的Message。
This Messenger is used to receive message from service.
*/
private Messenger mReceiveMessenger;
private TextView mMessageText;
/*
处理从Service收到的Message。
Handling Messages received from service.
*/
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MessageSource.MSG_CREATE_FLOAT:
String strI = (String) msg.obj;
mMessageText.setText(strI);
break;
case MessageSource.MSG_CREATE_INT:
String strF = (String) msg.obj;
mMessageText.setText(strF);
break;
case MessageSource.MSG_CREATE_STRING:
String strS = (String) msg.obj;
mMessageText.setText(strS);
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMessageText = (TextView) findViewById(R.id.message_from_service);
Button createIntBt = (Button) findViewById(R.id.let_service_create_int);
createIntBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
handleButtonClick(MessageSource.MSG_CREATE_INT);
}
});
Button createFloatBt = (Button) findViewById(R.id.let_service_create_float);
createFloatBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
handleButtonClick(MessageSource.MSG_CREATE_FLOAT);
}
});
Button createStringBt = (Button) findViewById(R.id.let_service_create_string);
createStringBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
handleButtonClick(MessageSource.MSG_CREATE_STRING);
}
});
}
@Override
protected void onResume() {
super.onResume();
if (!bServiceConnected) {
bindService();
}
}
@Override
protected void onPause() {
super.onPause();
unbindService(mServiceConnection);
}
private void handleButtonClick(int type) {
if (bServiceConnected) {
Message msg = new Message();
msg.what = type;
msg.replyTo = mReceiveMessenger;
try {
mSendMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
} else {
Toast.makeText(this, "Service has not been bound.", Toast.LENGTH_SHORT).show();
}
}
private void bindService() {
Intent intent = new Intent(getApplicationContext(), MainService.class);
bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
}
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
bServiceConnected = true;
mSendMessenger = new Messenger(iBinder);
mReceiveMessenger = new Messenger(mHandler);
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
bServiceConnected = false;
mSendMessenger = null;
mReceiveMessenger = null;
}
};
}
MainService
public class MainService extends Service {
/*
这个Handler负责接收Activity的Message,收到一个Message时,通过获取Message的replayTo得到一个Messenger实例,
使用这个Messenger向Activity发送Message。
This Handler is in charge of receiving Messages sending from Activity. When it receiving a
Message, get The replayTo which is a Messenger instance from this Message. Using this Messenger
to send Message to Activity.
*/
private Handler mActMsgHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MessageSource.MSG_CREATE_INT:
createAndSendInt(msg.replyTo);
break;
case MessageSource.MSG_CREATE_FLOAT:
createAndSendFloat(msg.replyTo);
break;
case MessageSource.MSG_CREATE_STRING:
createAndSendString(msg.replyTo);
break;
default:
break;
}
}
};
/*
这个Messenger用于向Activity发送Message。
This Messenger is used to send Message to Activity.
*/
private Messenger mSendMessenger = new Messenger(mActMsgHandler);
/*
假设有耗时的操作需要异步进行。
Suppose we have long-running jobs and execute asynchronously.
*/
private Executor mExecutor = Executors.newCachedThreadPool();
public MainService() {
}
@Override
public IBinder onBind(Intent intent) {
return mSendMessenger.getBinder();
}
private void createAndSendInt(final Messenger messenger) {
mExecutor.execute(new Runnable() {
@Override
public void run() {
Random random = new Random();
int ret = random.nextInt();
String str = "Give you a int: " + ret;
send(MessageSource.MSG_CREATE_INT, str, messenger);
}
});
}
private void createAndSendFloat(final Messenger messenger) {
mExecutor.execute(new Runnable() {
@Override
public void run() {
Random random = new Random();
float ret = random.nextFloat();
String str = "Give you a float: " + ret;
send(MessageSource.MSG_CREATE_FLOAT, str, messenger);
}
});
}
private void createAndSendString(final Messenger messenger) {
mExecutor.execute(new Runnable() {
@Override
public void run() {
int len = MessageSource.STRING_SOURCE_ARRAY.length;
Random random = new Random();
int index = random.nextInt(len);
String ret = MessageSource.STRING_SOURCE_ARRAY[index];
String str = "Give you a string: " + ret;
send(MessageSource.MSG_CREATE_STRING, str, messenger);
}
});
}
private void send(int type, String str, Messenger messenger) {
Message msg = new Message();
msg.what = type;
msg.obj = str;
try {
messenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
还有一个辅助的Class
MessageSource
public class MessageSource {
public static final int MSG_CREATE_INT = 1;
public static final int MSG_CREATE_FLOAT = 2;
public static final int MSG_CREATE_STRING = 3;
public static final String[] STRING_SOURCE_ARRAY = new String[]{"Awake from dreams",
"I find the locked tower high",
"Sober from wine", "I see the curtain hanging low",
"As last year spring grief seems to grow",
"Amid the falling blooms alone stand I",
"In the fine rain a pair of swallows fly",
"I still remember when I first saw pretty Ping",
"In silken dress embroidered with two hearts in a ring",
"Revealing lovesickness by touching pipa’s string",
"The moon shines bright just as last year",
"It did see her like a cloud disappear"};
}