Service trong android | bound services (part 2)

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 bn 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 bn có th viết các hàm x lý phc tp hơn tùy chnh theo ng dng ca bn

Để 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: Bn cn phi 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 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

ServiceTutorial

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

Bound Services, Service, android, thu thuat android, android tips

 

 HỖ TRỢ TRỰC TUYẾN