CĂN BẢN
INTENTS
GIAO DIỆN
CÁC KHÁI NIỆM
VÍ DỤ
TÀI LIỆU
HỌC LẬP TRÌNH ANDROID
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Services trong Android

Trong Android, service là một component giữ cho ứng dụng chạy ở chế độ nền để thực hiện các hoạt động lâu dài dựa trên yêu cầu. Service sẽ không hiển thị giao diện mà nó sẽ chạy các ứng dụng ở chế độ nền như phát nhạc hoặc xử lý các hoạt động mạng khi người dùng đang chạy các ứng dụng khác.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

1. Vòng đời service Android

Trong Android, vòng đời của service sẽ đi theo hai con đường khác nhau là Started hoặc Bound.

Started Service

Một component application, chẳng hạn như một activity gọi phương thức startService() khi bắt đầu nó sẽ chạy vô thời hạn trong nền ngay cả khi component khởi động bị hủy. Đó là một Started Service.

Chúng ta có thể dừng Started service bằng cách sử dụng phương thức stopService(), hoặc service có thể tự dừng bằng cách gọi phương thức stopSelf(). Trong Android, component Started service sẽ thực hiện một thao tác duy nhất và nó sẽ không trả lại bất kỳ kết quả nào cho người gọi.

Bài viết này được đăng tại [free tuts .net]

Bound Service

Một Bound service là khi một component khác gọi phương thức bindService(). Bound service sẽ chạy miễn là một component ứng dụng khác bị ràng buộc với nó.

Có thể hủy liên kết service bằng cách gọi phương thức unbindService(). Ngoài ra cũng có thể liên kết nhiều component với một service cùng lúc, service sẽ bị hủy trong trường hợp tất cả các component hủy liên kết.

2. Sơ đồ vòng đời service Android

Sơ đồ sau cho thấy vòng đời của Started service khi nó được tạo bằng startService(). Và vòng đời của Bound service khi nó được tạo bằng bindService().

1 png

Khi tạo một service chúng ta cần extends từ một lớp Service cơ sở hoặc một trong các lớp con của nó. Trong quá trình triển khai service, chúng ta phải ghi đè một số phương thức callback, những phương thức này xử lý các khía cạnh chính của vòng đời service và cho phép các component liên kết với service.

3. Tạo một service trong Android

Nói chung, trong Android để tạo một service, chúng ta phải tạo một lớp con của service hoặc sử dụng một trong các lớp con hiện có. Trong Android, các component như activity có thể khởi động service bằng cách gọi phương thức startService() , sẽ dẫn đến gọi phương thức onStartCommand() của service.

Sau đây là ví dụ đơn giản về việc tạo một service trong ứng dụng Android.

public class SampleService extends Service {


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //TODO write your own code

       return Service.START_NOT_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        //TODO for communication return IBinder implementation
        return null;
    }
}

4. Đăng ký một service trong tệp Manifest

Khi tạo một service, chúng ta phải đăng ký trong file Manifest của Android bằng phần tử <service> như dưới đây.

<manifest ... >

   ...
  <application ... >
     <service android:name=".SampleService" />
  </application>

  ...
</manifest>

5. Bắt đầu một service

Trong Android, các component như activity, service hoặc receiver có thể bắt đầu service bằng phương thức startService(). Sau đây là đoạn code mẫu của việc bắt đầu một service bằng phương thức startService.

Intent intent = new Intent(this, MyService.class);
startService(intent)

6. Phương thức callback của service trong Android

Trong quá trình xây dựng service ta cần ghi đè một số phương thức callback sau đây.

onStartCommand ()

Hệ thống sẽ gọi phương thức này khi một component khác như activity yêu cầu service bắt đầu bằng cách gọi startService () . Khi phương thức này được thực thi, service sẽ khởi động và chạy vô thời hạn trong nền. Nếu chúng ta thực hiện điều này trong code thì phải dừng service sau khi hoàn công việc bằng cách gọi phương thức stopSelf() hoặc stopService().

Trong Android, phương thức onStartCommand() phải trả về một kiểu Interger, đây là giá trị mô tả cách hệ thống sẽ tiếp tục service trong trường hợp hệ thống hủy nó.

Phương thức onStartCommand() sẽ trả về một giá trị là một trong những hằng số sau.

Tùy chọn Mô tả
START_STICKY Nó sẽ khởi động lại service trong trường hợp dữ liệu truyền cho phương thức onStartCommand () là NULL.
START_NOT_STICKY Nó sẽ không khởi động lại service và nó hữu ích cho những service chạy định kỳ. Service sẽ khởi động lại khi có lệnh startService (). Đó là cách tốt nhất để tránh service chạy khi không cần thiết.
START_REDELIVER_INTENT Nó giống như START_STICKY và nó tạo lại service, gọi onStartCommand() với intent cuối cùng đã được gửi đến service.

onBind ()

Hệ thống sẽ gọi phương thức này khi một component khác muốn liên kết với service bằng cách gọi bindService(). Trong quá trình thực hiện phương thức này, chúng ta phải cung cấp giao diện cho khách hàng để liên lạc với service bằng cách trả về một đối tượng IBinder.

onCreate ()

Hệ thống sẽ gọi phương thức này khi service được tạo bằng cách sử dụng phương thức onStartCommand() hoặc onBind(). Trong trường hợp nếu service đã chạy, thì phương thức này sẽ không được gọi.

onDestroy ()

Hệ thống sẽ gọi phương thức này khi service không còn được sử dụng và đang bị hủy. Đây là phương thức cuối cùng mà service sẽ nhận được và chúng ta cần triển khai phương thức này trong service của mình để dọn sạch mọi tài nguyên không sử dụng như threads, receivers hoặc listeners.

Nói chung, nếu bắt đầu service bằng phương thức gọi startService() thì service sẽ chạy liên tục ngay cả khi component khởi động service bị hủy, cho đến khi dừng service bằng cách sử dụng stopService() hoặc nó tự dừng với phương thức stopSelf().

Tương tự, nếu tạo một service bằng phương thức gọi bindService(), service sẽ chạy miễn là component đó bị ràng buộc với nó. Sau khi service không bị ràng buộc từ tất cả các client, hệ thống sẽ hủy nó.

Trong Android, vòng đời của service là có một tập hợp các phương thức callback cần được triển khai để theo dõi trạng thái service và thực hiện những điều cần thiết trong thời gian thích hợp.

7. Android Skeleton Service

Sau đây là skeleton service mô tả về từng phương thức trong vòng đời.

package com.tutlane.services;

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


public class SampleService extends Service {


    int mStartMode;       // It indicates how to behave if the service is killed
    IBindermBinder;      // interface for clients that bind
    boolean mAllowRebind; // It indicates whether onRebind should be used

    @Override
    public void onCreate() {
        // The service is being created
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // The service is starting, due to a call to startService()
        return mStartMode;
    }
    @Override
    public IBinder onBind(Intent intent) {
        // A client is binding to the service with bindService()
        return mBinder;
    }
    @Override
    public boolean onUnbind(Intent intent) {
        // All clients have unbound with unbindService()
        return mAllowRebind;
    }
    @Override
    public void onRebind(Intent intent) {
        // A client is binding to the service with bindService(),

      // after onUnbind() has already been called
    }
    @Override
    public void onDestroy() {
        // The service is no longer used and is being destroyed

}
}

8. Ví dụ về Service trong Android

Sau đây là ví dụ về việc bắt đầu phát nhạc ở chế độ nền .Khi chúng ta bắt đầu service và nhạc sẽ phát liên tục cho đến khi chúng ta dừng service .

Tạo một ứng dụng Android mới bằng cách sử dụng android studio và đặt tên là Service.

Bây giờ chúng ta cần tạo file service MyService.java trong đường dẫn \ java \ com.tutlane.service bằng cách nhấp chuột phải vào thư mục application -> New -> Java Class và đặt tên là MyService.java.

Hãy nhập nội dung dưới đây cho file này.

MyService.java

package com.tutlane.services;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.provider.Settings;
import android.widget.Toast;

/**
 * Created by Tutlane on 02-08-2017.
 */

public class MyService extends Service {
    private MediaPlayer player;
    @Override
    public IBinder onBind(Intent intent) {
        return  null;
    }
    @Override
    public void onCreate() {
        Toast.makeText(this, "Service was Created", Toast.LENGTH_LONG).show();
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        player = MediaPlayer.create(this, Settings.System.DEFAULT_RINGTONE_URI);
        // This will play the ringtone continuously until we stop the service.
        player.setLooping(true);
        // It will start the player
        player.start();
        Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
        return START_STICKY;
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        // Stopping the player when service is destroyed
        player.stop();
        Toast.makeText(this, "Service Stopped", Toast.LENGTH_LONG).show();
    }
}

Bây giờ mở file Activity_main.xml từ đường dẫn \ src \ main \ res \ layout và viết đoạn code sau.

Activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/btnStart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="startService"
        android:layout_marginLeft="130dp"
        android:layout_marginTop="150dp"
        android:text="Start Service"/>
    <Button
        android:id="@+id/btnstop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="stopService"
        android:layout_marginLeft="130dp"
        android:layout_marginTop="20dp"
        android:text="Stop Service"/>
</LinearLayout>

Bây giờ mở file MainActivity.java từ đường dẫn \ java \ com.tutlane.service và viết đoạn code sau để thực hiện tùy chỉnh broadcast intents.

MainActivity.java

package com.tutlane.services;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    // Start the service
    public void startService(View view) {
        startService(new Intent(this, MyService.class));
    }
    // Stop the service
    public void stopService(View view) {
        stopService(new Intent(this, MyService.class));
    }
}

Bây giờ chúng ta cần đăng ký service của mình trong file manifest Android ( AndroidManifest.xml ) bằng cách sử dụng thuộc tính <service> như được hiển thị bên dưới.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tutlane.services">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".MyService" />
    </application>
</manifest>

9 Kết quả của ví dụ về service trong Android

Khi chạy ví dụ trên trong trình giả lập Android sẽ nhận được kết quả như hiển thị bên dưới

2 gif

Nếu nhấp vào nút START SERVICE, nhạc chuông mặc định sẽ bắt đầu phát và nó sẽ tiếp tục cho đến khi stop service. Đây là cách tạo, bắt đầu hoặc dừng service trong các ứng dụng Android dựa trên yêu cầu .

Cùng chuyên mục:

Tìm hiểu về vòng đời của Activity trong Android

Tìm hiểu về vòng đời của Activity trong Android

AlarmManager trong Android

AlarmManager trong Android

Menu trong Android

Menu trong Android

Fragments trong Android

Fragments trong Android

SearchView trong Android

SearchView trong Android

TabLayout trong Android

TabLayout trong Android

ViewStub trong Android

ViewStub trong Android

Image Slider trong Android

Image Slider trong Android

Trình chuyển đổi hình ảnh (Image Switcher) trong Android

Trình chuyển đổi hình ảnh (Image Switcher) trong Android

ScrollView trong Android

ScrollView trong Android

ProgressBar trong Android

ProgressBar trong Android

Đồng hồ Analog và đồng hồ kỹ thuật số trong Android

Đồng hồ Analog và đồng hồ kỹ thuật số trong Android

Cách dùng TimePicker trong Android

Cách dùng TimePicker trong Android

Cách dùng DatePicker trong Android

Cách dùng DatePicker trong Android

Cách dùng SeekBar trong Android

Cách dùng SeekBar trong Android

Cách dùng WebView trong Android

Cách dùng WebView trong Android

Cách dùng RatingBar trong Android

Cách dùng RatingBar trong Android

Cách dùng ListView trong Android

Cách dùng ListView trong Android

AutoCompleteTextView trong Android

AutoCompleteTextView trong Android

Spinner trong Android

Spinner trong Android

Top