Saya sudah mencoba untuk memulai layanan ketika perangkat melakukan booting di android, tetapi saya tidak bisa membuatnya berfungsi. Saya telah melihat sejumlah tautan daring tetapi tidak ada kode yang berfungsi. Apakah saya lupa sesuatu?
AndroidManifest.xml
<receiver
android:name=".StartServiceAtBootReceiver"
android:enabled="true"
android:exported="false"
android:label="StartServiceAtBootReceiver" >
<intent-filter>
<action android:name="android.intent.action._BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service
android:name="com.test.RunService"
android:enabled="true" />
Penerima siaran
public void onReceive(Context context, Intent intent) {
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
Intent serviceLauncher = new Intent(context, RunService.class);
context.startService(serviceLauncher);
Log.v("TEST", "Service loaded at start");
}
}
Jawaban:
Jawaban lainnya terlihat bagus, tetapi saya pikir saya akan membungkus semuanya menjadi satu jawaban yang lengkap.
Anda perlu yang berikut ini di
AndroidManifest.xml
file Anda :Dalam
<manifest>
elemen Anda :Dalam
<application>
elemen Anda (pastikan untuk menggunakan nama kelas [atau relatif] yang memenuhi syarat untuk AndaBroadcastReceiver
):(Anda tidak perlu
android:enabled
,exported
, dll, atribut: default Android sudah benar)Dalam
MyBroadcastReceiver.java
:Dari pertanyaan awal:
<receiver>
elemen itu ada di dalam<application>
elemenBroadcastReceiver
ditentukan<intent-filter>
sumber
Sebagai info tambahan: BOOT_COMPLETE dikirim ke aplikasi sebelum penyimpanan eksternal dipasang. Jadi, jika aplikasi diinstal ke penyimpanan eksternal, ia tidak akan menerima pesan broadcast BOOT_COMPLETE.
Lebih detail di sini di bagian Penerima Siaran mendengarkan "boot selesai"
sumber
Cara memulai layanan pada boot perangkat (aplikasi autorun, dll.)
Untuk pertama: sejak versi Android 3.1+ Anda tidak menerima BOOT_COMPLETE jika pengguna tidak pernah memulai aplikasi Anda setidaknya sekali atau aplikasi "paksa ditutup" pengguna. Ini dilakukan untuk mencegah malware secara otomatis mendaftarkan layanan. Lubang keamanan ini ditutup di versi Android yang lebih baru.
Larutan:
Buat aplikasi dengan aktivitas. Ketika pengguna menjalankannya sekali aplikasi dapat menerima pesan broadcast BOOT_COMPLETE.
Untuk yang kedua: BOOT_COMPLETE dikirim sebelum penyimpanan eksternal dipasang. Jika aplikasi dipasang ke penyimpanan eksternal, ia tidak akan menerima pesan siaran BOOT_COMPLETE.
Dalam hal ini ada dua solusi:
Jika aplikasi Anda sudah terpasang di penyimpanan internal maka kode di bawah ini dapat membantu Anda memahami cara memulai layanan saat boot perangkat.
Di Manifest.xml
Izin:
Daftarkan penerima BOOT_COMPLETED Anda:
Daftarkan layanan Anda:
Di penerima OnBoot.java:
Untuk HTC, Anda mungkin perlu juga menambahkan Manifest kode ini jika perangkat tidak menangkap RECEIVE_BOOT_COMPLETED:
Penerima sekarang terlihat seperti ini:
Bagaimana cara menguji BOOT_COMPLETED tanpa me-restart emulator atau perangkat asli? Mudah. Coba ini:
Bagaimana cara mendapatkan id perangkat? Dapatkan daftar perangkat yang terhubung dengan id:
adb di ADT secara default dapat Anda temukan di:
Nikmati! )
sumber
Bersama
juga menggunakan,
Perangkat HTC tampaknya tidak menangkap BOOT_COMPLETED
sumber
android.intent.action.QUICKBOOT_POWERON
hanya dikirim ketika memulihkan dari boot cepat. Ini berarti Anda tidak perlu melakukan hal-hal seperti mengatur ulang alarm saat memulihkan dari Fast Boot saat dipelihara. Karena itu hanya perlu digunakan<action android:name="android.intent.action.QUICKBOOT_POWERON" />
jika Anda ingin melakukan sesuatu ketika pengguna berpikir perangkat telah di-boot.perhatikan bahwa di awal pertanyaan, ada kesalahan ketik:
<action android:name="android.intent.action._BOOT_COMPLETED"/>
dari pada :
<action android:name="android.intent.action.BOOT_COMPLETED"/>
satu "_" kecil dan semua masalah ini :)
sumber
Saya baru tahu bahwa itu mungkin karena
Fast Boot
opsi diSettings
>Power
Ketika saya mematikan opsi ini, aplikasi saya menerima siaran ini tetapi tidak sebaliknya.
By the way, saya memiliki
Android 2.3.3
diHTC Incredible S
.Semoga ini bisa membantu.
sumber
Saya pikir manifes Anda perlu menambahkan:
sumber
Setelah mencoba semua jawaban dan trik yang disebutkan, saya akhirnya menemukan mengapa kodenya tidak berfungsi di ponsel saya. Beberapa ponsel Android seperti "Huawei Honor 3C Android 4.2.2 " memiliki menu Statup Manager di pengaturannya dan aplikasi Anda harus diperiksa dalam daftar. :)
sumber
Saya memiliki
<category>
-tag tambahan , tidak tahu apakah itu membuat perbedaan.Sudahkah Anda mencoba menghilangkan klausa if
"android.intent.action.BOOT_COMPLETED".equals(intent.getAction()
, karena penerima mungkin hanya menerima maksud itu?sumber
Lihat Tautan Ini http://khurramitdeveloper.blogspot.in/2013/06/start-activity-or-service-on-boot.html Prosedur langkah demi langkah untuk menggunakan boot pada Layanan
sumber
Sebelum memasang penyimpanan eksternal, BOOT_COMPLETE dikirimkan, eksekusi.jika aplikasi Anda dipasang ke penyimpanan eksternal, aplikasi itu tidak akan menerima pesan siaran BOOT_COMPLETE. Untuk mencegah hal ini, Anda dapat menginstal aplikasi Anda di penyimpanan internal. Anda dapat melakukan ini hanya dengan menambahkan baris ini di menifest.xml
Beberapa perangkat HTC dapat mengaktifkan fitur "boot cepat" yang lebih seperti hibernasi yang dalam dan bukan reboot yang nyata dan karenanya tidak boleh memberikan maksud BOOT_COMPLETE. Untuk memulihkan ini, Anda dapat menambahkan filter maksud ini di dalam penerima Anda:
sumber
Inilah yang saya lakukan
1. Saya membuat kelas Penerima
2. di manifes
3.dan setelah SEMUA YANG ANDA BUTUHKAN untuk "mengatur" penerima di MainActivity Anda, mungkin di dalam onCreate
steap terakhir yang saya pelajari dari ApiDemos
sumber
Jika Anda menggunakan Android Studio dan Anda sangat menyukai pelengkapan otomatis maka saya harus memberi tahu Anda, saya menggunakan Android Studio v 1.1.0 dan saya menggunakan pelengkapan otomatis untuk izin berikut
Dan Android Studio Otomatis menyelesaikan
RECEIVE_BOOT_COMPLETED
semua dalam huruf kecil sepertireceive_boot_completed
dan saya terus menarik rambut saya karena saya sudah mencentang daftar saya untuk hal-hal yang harus dilakukan untuk memulai layanan saat boot. Saya baru saja mengkonfirmasi lagisumber
Seperti yang dikomentari @Damian, semua jawaban di utas ini salah. Melakukannya secara manual seperti ini berisiko Layanan Anda terhenti di tengah dari perangkat yang akan tidur. Anda harus mendapatkan kunci bangun terlebih dahulu. Untungnya, perpustakaan Dukungan memberi kami kelas untuk melakukan ini:
kemudian, di Layanan Anda, pastikan untuk melepaskan kunci bangun:
Jangan lupa untuk menambahkan izin WAKE_LOCK ke mainfest Anda:
sumber
onNewIntent()
? Atau Anda bisa melihat sumber untuk IntentService dan melihat apa yang perlu Anda lakukan agar Layanan Anda cocok dengan itu ...Bahkan, saya mendapatkan masalah ini belum lama ini, dan itu benar-benar sangat mudah untuk diperbaiki, Anda benar-benar tidak melakukan kesalahan jika Anda mengatur
"android.intent.action.BOOT_COMPLETED"
izin dan maksud-filter.Perhatikan bahwa jika Anda menggunakan Android 4.X, Anda harus menjalankan pendengar siaran sebelum memulai layanan saat boot, itu artinya, Anda harus menambahkan aktivitas terlebih dahulu, setelah penerima siaran Anda berjalan, aplikasi Anda harus berfungsi seperti yang Anda harapkan, Namun, pada Android 4.X, saya belum menemukan cara untuk memulai layanan saat boot tanpa aktivitas apa pun, saya pikir google melakukan itu untuk alasan keamanan.
sumber
Saya menghadapi masalah ini jika saya meninggalkan konstruktor kosong di kelas penerima. Setelah menghapus contsructor kosong di methosRriveive mulai bekerja dengan baik.
sumber