Saya sadar bahwa pertanyaan ini telah banyak ditanyakan di situs ini, namun, saya tidak dapat menemukan solusinya. Penerima BOOT_COMPLETED saya tidak dipanggil ketika aplikasi tidak berjalan.
Manifes:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.startuptest"
android:versionCode="1"
android:versionName="1.0"
android:installLocation="internalOnly">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.startuptest.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.example.startuptest.StartUpBootReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
StartUpBootReceiver:
public class StartUpBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("startuptest", "StartUpBootReceiver " + intent.getAction());
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
Log.d("startuptest", "StartUpBootReceiver BOOT_COMPLETED");
}
}
}
Jika aplikasi sedang berjalan dan saya mensimulasikan panggilan dengan
adb shell
am broadcast -a android.intent.action.BOOT_COMPLETED
Peristiwa diterima dengan benar, namun, jika aplikasi ditutup, peristiwa tidak diterima, dan juga tidak diterima saat aplikasi dijalankan.
Saya telah menginstal aplikasi kemudian meluncurkannya beberapa kali untuk memastikan aplikasi tersebut terdaftar. Saya cukup bingung dalam hal ini, jadi saran apa pun akan sangat saya hargai.
Sunting: Saya dapat melihat di log bahwa semua aplikasi tertutup lainnya (Youtube, FileObserver, dll) menerima acara boot_completed, hanya saja bukan milik saya.
Dimulai dengan Android 3.1, semua aplikasi, setelah instalasi, ditempatkan dalam keadaan "stopped" (Ini adalah kondisi yang sama dengan aplikasi yang berakhir setelah pengguna menghentikan paksa aplikasi dari aplikasi Pengaturan).
Saat berada dalam kondisi "berhenti", aplikasi tidak akan berjalan dengan alasan apa pun, kecuali dengan peluncuran aktivitas secara manual. (Artinya tidak ada BroadcastReceivers
(ACTION_PACKAGE_INSTALLED
, BOOT_COMPLETED
, dsb.) yang akan dipanggil, terlepas dari aktivitas yang telah didaftarkan, sampai pengguna menjalankan aplikasi secara manual).
Ini adalah langkah anti-malware dari Google. Google telah menganjurkan agar pengguna meluncurkan aktivitas dari peluncur terlebih dahulu, sebelum aplikasi tersebut dapat melakukan banyak hal. Mencegah BOOT_COMPLETED
agar tidak dikirimkan sampai aktivitas diluncurkan adalah konsekuensi logis dari argumen tersebut.
Detail lebih lanjut tentang hal ini:
http://developer.android.com/about/versions/android-3.1.html#launchcontrols
http://commonsware.com/blog/2011/07/05/boot-completed-regression.html
http://devmaze.wordpress.com/2011/12/05/activating-applications/
Saya memulai aplikasi saya ketika BOOT_COMPLETED, jadi saya tahu aplikasi ini berfungsi. Saya menambahkan Log.d
tidak akan muncul. Saya menambahkan Toast
maka akan muncul. Perbedaan kecil di Manifest.xml
<receiver android:name="com.example.startuptest.StartUpBootReceiver" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
sedang berjuang dengan masalah yang sama, alasannya adalah Anda menggunakan Log.d untuk melacak aplikasi Anda di logcat, sayangnya ketika Anda me-restart ponsel Anda, aplikasi menerima BOOT_Complete tetapi Anda tidak dapat melihatnya karena tidak masuk ke logcat.
coba buat Toast
dengan beberapa teks sebagai pengganti Log.d
untuk memastikan apakah BOOT_COMPLETE diterima atau tidak.
semoga ini membantu.