Service là một trong 4 thành phần chính của android. Service không có giao diện chuyên dùng để thực hiện một nhiệm vụ nào đó được thực hiện ngầm dưới background mà không cần tương tác đến giao diện ví dụ như: chơi nhạc nền, download file, xử lý tính toán…
Vòng đời của service:
Note:
Khi có một context nào đó gọi startService() để start service mong muốn. Nếu service đó chưa được tạo thì sẽ gọi onCreate() rồi gọi tiếp onStart() và khi đó service chạy nền bên dưới.
Nếu sau đó lại có một context muốn start service này mà service đã đang chạy, chỉ có phương thức onStart() của service được gọi.
Dù service có được gọi start bao nhiêu lần thì cũng chỉ có 1 instance của service và chỉ cần gọi stopService() một lần để kết thúc service.
Có 2 kiểu để start Service:
1: Sử dụng phương thức startService() : thường được xử dụng để thực thi một hành động đơn và có thể không return lại kết quả (ví dụ như chơi nhạc)
2: Sử dụng bindService(): cung cấp một interface dạng client-server cho phép apps có thể “conversation” (nói chuyện, tương tác) với service
Trong ví dụ này để các bạn có thể hiểu rõ về cách startService() mình sẽ trình bày làm một ứng dụng đơn giản với 2 buton để startService() và stopService(); khi service được start thì sẽ chạy bản nhạc và sẽ dừng phát nhạc khi service được stop.
Bound Service mình sẽ trình bày trong các tutorial tiếp theo
Để 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: tạo folder raw trong thư mục res sau đó copy một file nhạc vào đó (trong ví dụ này mình sử dụng file nhạc có tên hoabanglang.mp3)
Các bạn có thể down file hoabanglang.mp3 theo link sau
Audio Player
00:00
Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.
00:00
Use Up/Down Arrow keys to increase or decrease volume.
Bước 2: mở file res->values->String.xml
<resources>
<string name="app_name">ServiceDemo</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string name="StartService">Start Service</string>
<string name="StopService">Stop Service</string>
</resources>
Bước 3: mở file res->layout-> activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingTop="10dp"
tools:context=".MainActivity" >
<Button
android:id="@+id/btStartService"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/StartService" />
<Button
android:id="@+id/btStopService"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/StopService" />
</LinearLayout>
Bước 4: tạo file MyService.java trong packet com.example.servicedemo
package com.example.servicedemo;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
public class MyService extends Service {
// khai bao bien kieu MediaPlayer de quan ly file nhac
MediaPlayer player;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
Log.d("MyService", "onBind");
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
Log.d("MyService", "onCreate");
// khoi tao bien player tu res
player = MediaPlayer.create(this, R.raw.hoabanglang);
player.setLooping(false);
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
Log.d("MyService", "onStart");
// chay file nhac
player.start();
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
Log.d("MyService", "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
Log.d("MyService", "onDestroy");
if (player.isPlaying()) {
// neu dang choi nhac thi stop file nhac
player.stop();
}
super.onDestroy();
}
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
Log.d("MyService", "onUnbind");
return super.onUnbind(intent);
}
}
Note: tương tự như activity muốn startService thì app cần phải khai báo trong AndroidManifest.xml
</i> <i><service android:name=".MyService"></service>
Bước 5: Mở file MainActivity.java
package com.example.servicedemo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener {
// khai bao Button
private Button btStartService, btStopService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// link den layout de dieu khien
btStartService = (Button) findViewById(R.id.btStartService);
btStopService = (Button) findViewById(R.id.btStopService);
// dang ky lang nghe su kien onClick vao button
btStartService.setOnClickListener(this);
btStopService.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onClick(View v) {
// khai bao Intent de start Service tuong tu start Activity
Intent mIntent = new Intent(MainActivity.this, MyService.class);
switch (v.getId()) {
case R.id.btStartService:
// click button Start Service
startService(mIntent);
break;
case R.id.btStopService:
// click button Stop Service
stopService(mIntent);
break;
default:
break;
}
}
}
Bước 6: Mở file AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.servicedemo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.servicedemo.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".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
ServiceDemo
Kết quả thực hiện chương trình