TUT ANDROID 025: Service trong android | Bound Services (part 2)

Trong ví dụ này mình sẽ hướng dẫn các bạn về Bound Services

Bound Services đóng vai trò như một server trong mô hình client-server. Bound Services cho phép các thành phần của app (như activity) có thể liên kết với service để “send requests”, “receive responses” hoặc “Inter-Process Communication(IPC)”.

Bound Services chỉ tồn tại khi nó đang phục vụ một thành phần khác của app gọi đến nó mà không tồn tại dưới vô hạn dưới background

Có 3 cách để BindService từ các thành phần của app

–          Sử dụng Ibinder class

–          Sử dụng Messenger class

–          Sử dụng AIDL

Note: các bạn có thể xem rõ chi tiết theo link dưới đây

http://developer.android.com/guide/components/bound-services.html

Trong ví dụ lần này để làm rõ về Bound Services mình sẽ làm một ứng dụng đơn giản gọi bindService để thực hiện tính tổng 2 số nguyên

Note: các bạn có thể viết các hàm xử lý phức tạp hơn tùy chỉnh theo ứng dụng của bạn

Để 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">ServiceTutorial</string>
 <string name="ktHaiCham">:</string>
 <string name="ktBang">=</string>
 <string name="X">X</string>
 <string name="Y">Y</string>
 <string name="ktTongXY">X+Y</string>
 <string name="textBTN">Send Request get SUM</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" >

<LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="horizontal" >

<EditText
 android:id="@+id/etX"
 android:layout_width="0dp"
 android:layout_height="wrap_content"
 android:layout_weight="1"
 android:hint="@string/X"
 android:inputType="number" />

<TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="@string/ktHaiCham" />

<EditText
 android:id="@+id/etY"
 android:layout_width="0dp"
 android:layout_height="wrap_content"
 android:layout_weight="1"
 android:hint="@string/Y"
 android:inputType="number" />

<TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="@string/ktBang" />

<EditText
 android:id="@+id/etSUM"
 android:layout_width="0dp"
 android:layout_height="wrap_content"
 android:enabled="false"
 android:layout_weight="1"
 android:hint="@string/ktTongXY"
 android:inputType="number" />
 </LinearLayout>

<Button
 android:id="@+id/btnGetResult"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_marginTop="10dp"
 android:text="@string/textBTN" />

</LinearLayout>

Bước 3: tạo file MyService.java trong packet com.basetut.servicetutorial

package com.basetut.servicetutorial;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

public class MyService extends Service {

// Binder given to clients
 private final IBinder mBinder = new LocalBinder();

@Override
 public IBinder onBind(Intent intent) {
 return mBinder;
 }

public class LocalBinder extends Binder {
 MyService getService() {
 // Return this instance of LocalService so clients can call public
 // methods
 return MyService.this;
 }
 }

// viet cac method xu ly ngam de ung dung co the goi tu activity
 // trong bai nay minh viet mot phuong thuc demo don gian la phuong thuc Cong

public int Sum(int a, int b) {
 return a + b;
 }

 // viet cac ham cac ban can khac o duoi
 // ...
}

Note: Bạn cần phải khai báo trong AndroidManifest.xml

</i> <i><service android:name=".MyService"></service> 

Bước 4: Mở file MainActivity.java

package com.basetut.servicetutorial;

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.IBinder;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.basetut.servicetutorial.MyService.LocalBinder;

public class MainActivity extends Activity {

MyService mService;
 boolean mBound = false;

private EditText etX, etY, etSUM;
 private Button btnGetResult;

@Override
 protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
 setContentView(R.layout.layout_mainactivity);

etX = (EditText) findViewById(R.id.etX);
 etY = (EditText) findViewById(R.id.etY);
 etSUM = (EditText) findViewById(R.id.etSUM);
 btnGetResult = (Button) findViewById(R.id.btnGetResult);

btnGetResult.setOnClickListener(new OnClickListener() {

@Override
 public void onClick(View v) {

String strX = etX.getText().toString();
 String strY = etY.getText().toString();
 if ((!strX.equals("")) && (!strY.equals(""))) {
 int valueX = 0, valueY = 0;
 try {
 valueX = Integer.parseInt(strX);
 valueY = Integer.parseInt(strY);
 } catch (Exception e) {
 Log.e("MainActivity", "Error parseInt!!!!!!!!");
 }
 if (mBound) {
 int getSumFromService = mService.Sum(valueX, valueY);
 etSUM.setText(String.valueOf(getSumFromService));
 } else {
 Toast.makeText(MainActivity.this,
 "Service not connect", Toast.LENGTH_LONG)
 .show();
 }
 } else {
 Toast.makeText(MainActivity.this, "Phai nhap X Y",
 Toast.LENGTH_LONG).show();
 }

}
 });

}

@Override
 protected void onStart() {
 super.onStart();
 // bind to MyService
 Intent intent = new Intent(this, MyService.class);
 bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
 }

@Override
 protected void onStop() {
 super.onStop();
 // Unbind from the service
 if (mBound) {
 unbindService(mConnection);
 mBound = false;
 }
 }

/** Defines callbacks for service binding, passed to bindService() */
 private ServiceConnection mConnection = new ServiceConnection() {

@Override
 public void onServiceConnected(ComponentName className, IBinder service) {
 // We've bound to LocalService, cast the IBinder and get
 // LocalService instance
 LocalBinder binder = (LocalBinder) service;
 mService = binder.getService();
 mBound = true;
 }

@Override
 public void onServiceDisconnected(ComponentName arg0) {
 mBound = false;
 }
 };

}

Bước 5: Mở file AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.basetut.servicetutorial"
 android:versionCode="1"
 android:versionName="1.0" >

<uses-sdk
 android:minSdkVersion="8"
 android:targetSdkVersion="8" />

<application
 android:allowBackup="true"
 android:icon="@drawable/ic_launcher"
 android:label="@string/app_name"
 android:theme="@style/AppTheme" >
 <activity android:name="com.basetut.servicetutorial.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.servicetutorial.MyService" >
 </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

ServiceTutorial

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

1

Comments
  1. 5 years ago
  2. 4 years ago
  3. 4 years ago
  4. 4 years ago

Leave a Reply

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