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
WorkManagerhoặcJobSchedulercho 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_POWERONdà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.