Service trong android | bound services (part 3)

Để 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 gin đ mô t cách kết ni t activity đến bound service bng Messager class và nhn 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: Bn cn phi 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 bn có th theo dõi kết qu thc hin chương trình trên logcat và màn hình. . Khi làm theo ví d các bn có gì không hiu có th đ li câu hi trên web mình s tr li các bn mt cách nhanh nht có th. Các bn có th down full src theo link dưới đây

ServiceTutorialUseMessager

Kết quả thực hiện chương trình

bound service, Service, android tips, android, thu thuat android

bound service, Service, android tips, android, thu thuat android

 

 HỖ TRỢ TRỰC TUYẾN