Để các bạn có thể hiểu rõ hơn về sử dụng bound services với messager class trong ví dụ này mình sẽ làm một ứng dụng đơn giản có sử dụng bound services để chuyển ký tự thường trong edittext thành ký tự hoa và hiển thị trong textview ở dưới
Note: mình viết ví dụ đơn giản để mô tả cách kết nối từ activity đến bound service bằng Messager class và nhận response từ service
Để làm được ví dụ này các bạn làm lần lượt theo các bước sau
Bước 1: mở file res->values->String.xml
<resources>
<string name="app_name">ServiceTutorialUseMessager</string>
<string name="EnterText">Enter text you need Convert to Upcase</string>
<string name="textOfTv">String Text Upcase will show here!</string>
<string name="textOfbtn">send request to service</string>
</resources>
Bước 2: mở file res->layout-> activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingTop="10dp" >
<EditText
android:id="@+id/etText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/EnterText" />
<TextView
android:id="@+id/tvText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:hint="@string/textOfTv"
android:textSize="20sp"
android:textStyle="italic" />
<Button
android:id="@+id/btnSendRequest"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/textOfbtn" />
</LinearLayout>
Bước 3: tạo file ConvertService.java trong packet com.basetut.servicetutorialusemessager
package com.basetut.servicetutorialusemessager;
import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
public class ConvertService extends Service {
public static final int TO_UPPER_CASE = 101;
public static final int TO_UPPER_CASE_RESPONSE = 102;
// khi co new messenger de goi ConvertHanlder
private Messenger msg = new Messenger(new ConvertHanlder());
@SuppressLint("HandlerLeak")
class ConvertHanlder extends Handler {
@SuppressLint("DefaultLocale")
@Override
public void handleMessage(Message msg) {
// This is the action
int msgType = msg.what;
switch (msgType) {
case TO_UPPER_CASE: {
try {
// nhan data gui den
String data = msg.getData().getString("data");
// init response message
Message resp = Message.obtain(null, TO_UPPER_CASE_RESPONSE);
Bundle bResp = new Bundle();
bResp.putString("respData", data.toUpperCase());
resp.setData(bResp);
// gui response data da duoc xu ly ve cho activity
msg.replyTo.send(resp);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
default:
super.handleMessage(msg);
}
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return msg.getBinder();
}
}
Note: Bạn cần phải khai báo trong AndroidManifest.xml
<service android:name="com.basetut.servicetutorialusemessager.ConvertService" ></service>
Bước 4: Mở file MainActivity.java
package com.basetut.servicetutorialusemessager;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ServiceConnection mConnection;
private Messenger messenger;
private String result;
private TextView tvText;
private EditText etText;
private Button btnSendRequest;
boolean mBound;
// private ConvertService mService;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_mainactivity);
// creat Connection to bind service
mConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
mBound = false;
messenger = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// connect voi service
messenger = new Messenger(service);
mBound = true;
}
};
// get control view
tvText = (TextView) findViewById(R.id.tvText);
etText = (EditText) findViewById(R.id.etText);
btnSendRequest = (Button) findViewById(R.id.btnSendRequest);
btnSendRequest.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mBound) {
String val = etText.getText().toString();
// init message voi msg.what = ConvertService.TO_UPPER_CASE
Message msg = Message.obtain(null,
ConvertService.TO_UPPER_CASE);
// dang ky nhan response tu service bang class ResponseHandler
msg.replyTo = new Messenger(new ResponseHandler());
// gui du lieu den service
Bundle b = new Bundle();
b.putString("data", val);
msg.setData(b);
try {
// gui du lieu den service xu ly
messenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
} else {
Toast.makeText(MainActivity.this,
"Service is disconneted!", Toast.LENGTH_LONG)
.show();
}
}
});
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
bindService(new Intent(this, ConvertService.class), mConnection,
Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
super.onStop();
if (mBound) {
unbindService(mConnection);
mBound = false;
}
}
// This class handles the Service response
@SuppressLint("HandlerLeak")
class ResponseHandler extends Handler {
@Override
public void handleMessage(Message msg) {
int respCode = msg.what;
switch (respCode) {
case ConvertService.TO_UPPER_CASE_RESPONSE: {
// get data response tu service
result = msg.getData().getString("respData");
// hien thi data cho textview
tvText.setText(result);
}
}
}
}
}
Bước 5: Mở file AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.basetut.servicetutorialusemessager"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity android:name="com.basetut.servicetutorialusemessager.MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.basetut.servicetutorialusemessager.ConvertService" >
</service>
</application>
</manifest>
Note:
Các bạn có thể theo dõi kết quả thực hiện chương trình trên logcat và màn hình. . Khi làm theo ví dụ các bạn có gì không hiểu có thể để lại câu hỏi trên web mình sẽ trả lời các bạn một cách nhanh nhất có thể. Các bạn có thể down full src theo link dưới đây
ServiceTutorialUseMessager
Kết quả thực hiện chương trình