Service trong android và ứng dụng

1.Giới thiệu về Service

Service là một trong bốn thành phần cơ bản của một ứng dụng Android (Activity, Service, BroadcastReceiver, ContentProvider), được sử dụng để thực hiện các tiến trình ngầm mà không ảnh hưởng đến hoạt động của người dùng, không cần tương tác với người dùng thậm chí ngay cả khi ứng dụng đã tắt.

Service bao gồm 2 kiểu:

  • Started: một service là kiểu "started" khi nó được gọi bằng phương thức startService(). Khi đó service có thể chạy ngầm vô thời hạn, ngay cả khi component đã gọi nó ngừng hoạt động. Khi service thực hiện xong các tác vụ nó đảm nhận hoặc được gọi bởi phương thức stopService() thì service sẽ ngừng hoạt động.
  • Bound: một service là kiểu "bound" khi nó được liên kết với một thành phần của ứng dụng qua phương thức bindService(), Bound Service sẽ cung cấp một giao diện client-server cho phép các thành phần có thể tương tác với service. Nhiều component có thể bind đến service cùng 1 lúc. Bound Service sẽ ngừng hoạt động khi tất cả các component đó được unbind.

Vòng đời của service: life cycle service.PNG

Khi hết bộ nhớ hoặc trên một số máy android có chức năng Clear Memmory/ Clear RAM thì khi người dùng clear, toàn bộ các service chạy dưới background sẽ bị destroy, tuy nhiên service có cơ chế để tự động restart, ví dụ như return START_STICKY trong hàm onStartCommand(). Tuy nhiên một số trường hợp service bị crash và không restart lại được.

Có thể xem ứng dụng nào đang sử dụng service chạy ngầm bằng cách vào Setting -> Apps -> Running, ví dụ ở đây có thể thấy Zalo và Messenger đang có 1 service chạy ngầm:

Screenshot_2015-09-26-00-51-33.jpg

Những ứng dụng chạy ngầm có thể gây tốn tài nguyên và năng lượng của máy, để tắt service có thể click vào app và chọn stop, tuy nhiên nhiều app có cơ chế tự restart lại service thì phải vào All Apps -> chọn app rồi force stop mới dừng được, đặc biệt là các ứng dụng AppLock

2.Ứng dụng của Service

Service có thể được ứng dụng trong các công việc cần thực hiện ngầm, không gây ảnh hưởng đến tương tác của người dùng, ví dụ download, upload, phát nhạc, lấy thông tin từ server rồi thông báo cho người dùng ở một thời điểm nào đó.

Một ví dụ sau đây sẽ sử dụng một service liên tục kiểm tra xem ứng dụng nào đang hiển thị trên màn hình điện thoại -> mục đích có thể tương tự như AppLock, khi điều kiện đúng sẽ start từ service 1 màn hình để che lên trên. Trong Android, không thể kill 1 ứng dụng đang chạy từ một ứng dụng khác, vì vậy thực tế các ứng dụng AppLock hiện có trên Store vẫn là dùng một màn hình khác che lên trên.

Đầu tiên tạo 1 class extend từ Service rồi override lại onStartCommand

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    CheckThread check = new CheckThread(getApplicationContext(), this);
    check.start();
    return START_STICKY;
}

Tạo 1 thread để thực hiện các công việc trong đó, class CheckThread, hàm run():

public void run() {
    while(true) {
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            return;
        }

        try {

            ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            List<ActivityManager.RunningTaskInfo> alltasks = am.getRunningTasks(1);

            for (int i1 = 0; i1 < alltasks.size(); i1++) {
                ActivityManager.RunningTaskInfo aTask = alltasks.get(i1);

                Log.i("TASK", "aTask.topActivity: " + aTask.topActivity.getClassName());
            }

        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

Trước đó cần khai báo quyền trong AndroidManifest.xml

<uses-permission android:name="android.permission.GET_TASKS"/>

Như vậy cứ 200ms, chương trình sẽ check 1 lần và log ra xem ứng dụng nào đang ở màn hình top của điện thoại, khi đó bạn có thể show lên gì đó khá giống với AppLock, tuy nhiên, với các ứng dụng AppLock thì cần có cơ chế restart Service tốt hơn, chỉ dùng return START_STICKY thì không đảm bảo được luôn chạy trong các trường hợp, trong khi điều quan trọng nhất của AppLock là luôn luôn chạy thậm chí là ngăn cản người dùng dừng chương trình.


All Rights Reserved