TUT ANDROID 026: Service trong android | bound services (part 3)

Trong tut lần này mình sẽ hướng dẫn các bạn cách thứ 2 để bindService đó là dùng Messenger class

Để 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

26_1

26_2

Comments
  1. 5 years ago
    • 3 years ago

Leave a Reply

Your email address will not be published. Required fields are marked *