Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách khởi động Service khi Boot Completed trên Android bằng Kotlin

Giới thiệu

Hướng dẫn này trình bày cách tự động khởi động một Service khi thiết bị Android hoàn tất quá trình khởi động (boot completed) bằng Kotlin. Cần kết hợp BroadcastReceiver lắng nghe action BOOT_COMPLETED.

Các bước thực hiện

Bước 1: Tạo dự án mới

Tạo project: File → New Project trong Android Studio.

Bước 2: Thiết kế giao diện (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="4dp"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="50dp"
        android:text="Tutorials Point"
        android:textAlignment="center"
        android:textColor="@android:color/holo_green_dark"
        android:textSize="32sp"
        android:textStyle="bold" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Hello World"
        android:textColor="@android:color/background_dark"
        android:textSize="24sp"
        android:textStyle="bold" />

</RelativeLayout>

Bước 3: Tạo Service (RunServiceOnBoot.kt)

import android.app.Service
import android.content.Intent
import android.os.Handler
import android.os.IBinder
import android.util.Log
import android.widget.Toast

class RunServiceOnBoot : Service() {
    private val TAG = "MyService"
    private lateinit var handler: Handler
    private lateinit var runnable: Runnable
    private val runTime = 5000L

    override fun onCreate() {
        super.onCreate()
        Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show()
        Log.i(TAG, "onCreate")

        handler = Handler()
        runnable = Runnable { handler.postDelayed(runnable, runTime) }
        handler.post(runnable)
    }

    override fun onBind(intent: Intent?): IBinder? = null

    override fun onDestroy() {
        handler.removeCallbacks(runnable)
        super.onDestroy()
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        return START_STICKY // Tự động restart nếu bị kill
    }

    override fun onStart(intent: Intent?, startId: Int) {
        super.onStart(intent, startId)
        Log.i(TAG, "onStart")
    }
}

Bước 4: Tạo BroadcastReceiver (StartAppOnBoot.kt)

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent

class StartAppOnBoot : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (intent?.action == Intent.ACTION_BOOT_COMPLETED) {
            val i = Intent(context, MainActivity::class.java).apply {
                addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            }
            context?.startActivity(i)
        }
    }
}

Bước 5: MainActivity.kt

import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Khởi động service khi app chạy
        val intent = Intent(this, RunServiceOnBoot::class.java)
        startService(intent)
    }
}

Bước 6: Cấu hình Manifest (androidManifest.xml) - QUAN TRỌNG

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.q9">

    <!-- Quyền bắt buộc để nhận boot completed -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <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>

        <!-- BroadcastReceiver cho BOOT_COMPLETED -->
        <receiver
            android:name=".StartAppOnBoot"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            </intent-filter>
        </receiver>

        <!-- Khai báo Service -->
        <service android:name=".RunServiceOnBoot" />

    </application>
</manifest>

Chạy và kiểm tra

Cài đặt app, sau đó khởi động lại thiết bị (reboot). Service sẽ tự chạy. Kiểm tra qua logcat với tag "MyService" hoặc xem Toast "Service Started".

Lưu ý quan trọng (Android 8.0+)

  • Background execution limits: Android 8.0+ hạn chế service chạy ngầm. Nên dùng WorkManager hoặc JobScheduler cho tác vụ định kỳ.
  • android:exported="true" bắt buộc cho receiver từ Android 12+.
  • Một số OEM (Xiaomi, Huawei, Samsung...) yêu cầu user cấp quyền "Auto-start" trong cài đặt bảo mật.
  • Action QUICKBOOT_POWERON dành cho một số thiết bị có fast boot.

Khuyến nghị hiện đại

Thay vì Service chạy liên tục, hãy sử dụng WorkManager cho các tác vụ nền định kỳ, hoặc Foreground Service với notification nếu cần chạy liên tục.