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