Bagaimana cara memulai aplikasi saya saat startup?

241

Saya mencoba menggunakan kode sampel di tautan ini tetapi tampaknya sudah usang dan tidak berfungsi. Jadi perubahan apa yang harus saya buat dan file apa yang membuat aplikasi saya mulai secara otomatis ketika Android selesai booting?

Poojan
sumber

Jawaban:

315

Pertama, Anda perlu izin di AndroidManifest.xml:

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

Selain itu, di Anda AndroidManifest.xml, tentukan layanan Anda dan dengarkan tindakan BOOT_COMPLETED :

<service android:name=".MyService" android:label="My Service">
    <intent-filter>
        <action android:name="com.myapp.MyService" />
    </intent-filter>
</service>

<receiver
    android:name=".receiver.StartMyServiceAtBootReceiver"
    android:label="StartMyServiceAtBootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

Maka Anda perlu mendefinisikan penerima yang akan mendapatkan tindakan BOOT_COMPLETED dan memulai layanan Anda.

public class StartMyServiceAtBootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Intent serviceIntent = new Intent(context, MyService.class);
            context.startService(serviceIntent);
        }
    }
}

Dan sekarang layanan Anda harus berjalan ketika telepon dinyalakan.

Sean Schulte
sumber
8
Aktivitas: developer.android.com/guide/topics/fundamentals/activities.html Layanan: developer.android.com/guide/topics/fundamentals/services.html Untuk memulai aplikasi Anda ketika telepon benar-benar mulai, Anda harus daftarkan layanan seperti yang ditunjukkan di atas, dan kemudian di sana Anda dapat menggunakan startActivity () untuk memulai aplikasi Anda. Ini bukan ide yang baik untuk meletakkan layar di depan pengguna jika mereka tidak memintanya.
Sean Schulte
19
Hanya ingin menambahkan bahwa akan lebih baik menggunakan Intent.ACTION_BOOT_COMPLETEDalih-alih-mengkode string pada Receiver Anda. Juga, harus menggunakan Intent(context, MySystemService.class)konstruktor baru saat membuat Intent.
brianestey
7
Apakah ada alasan untuk memeriksa jenis maksud jika filter maksud digunakan?
Pijusn
1
Untuk beberapa alasan im mendapatkan Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own filepada public classbaris. Ada ide?
pattyd
3
Apa itu MySystemService?
Olah raga
120

Ini adalah cara membuat aktivitas mulai berjalan setelah perangkat Android dinyalakan ulang:

Masukkan kode ini ke AndroidManifest.xmlfile Anda , di dalam <application>elemen ( bukan di dalam <activity>elemen):

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

<receiver
    android:enabled="true"
    android:exported="true" 
    android:name="yourpackage.yourActivityRunOnStartup"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

</receiver>

Kemudian buat kelas baru yourActivityRunOnStartup(cocok dengan yang android:nameditentukan untuk <receiver>elemen dalam manifes):

package yourpackage;

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

public class yourActivityRunOnStartup extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            Intent i = new Intent(context, MainActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    }

}

Catatan: Panggilan i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);itu penting karena aktivitas diluncurkan dari konteks di luar aktivitas. Tanpa ini, aktivitas tidak akan dimulai.

Juga, nilainya android:enabled, android:exporteddan android:permissiondalam <receiver>tag tampaknya tidak wajib. Aplikasi menerima acara tanpa nilai-nilai ini. Lihat contoh di sini .

thrylos
sumber
Saya suka "pintasan" ini untuk menghindari keharusan membuat layanan lokal. Apakah kode itu termasuk dalam kelas yang diperluas Application? Mungkin di dalam onCreate()?
Seseorang di suatu tempat
2
terlihat seperti itu ayat kode harus berada dalam onReceive()sebuahBroadcastReceiver
Seseorang Somewhere
2
Kode ini harus dalam aktivitas yaitu "yourActivityrRunOnStartup" yang memperluas kelas BroadcastReceiver dan di dalam metode onReceive ().
thrylos
2
Saya mencoba untuk memberi 10 upvotes tetapi tidak bisa. Maaf dan terima kasih
Sayka
1
Ini bekerja untuk saya, tetapi HANYA jika jika saya baru saja "<action android: name =" android.intent.action.BOOT_COMPLETED "/>" di filter maksud. Jika saya menggunakan dua yang lain itu tidak berhasil.
emhomm4
67

Dengarkan ACTION_BOOT_COMPLETE dan lakukan apa yang Anda butuhkan dari sana. Ada cuplikan kode di sini.

Memperbarui:

Tautan orisinal pada jawaban tidak berfungsi, jadi berdasarkan komentar, ini adalah kode tertaut, karena tidak ada yang akan melewatkan kode ketika tautan tidak aktif.

Di AndroidManifest.xml (aplikasi-bagian):

<receiver android:enabled="true" android:name=".BootUpReceiver"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

        <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
</receiver>

...

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

...

public class BootUpReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
                Intent i = new Intent(context, MyActivity.class);  //MyActivity can be anything which you want to start on bootup...
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(i);  
        }

}

Sumber: https://web.archive.org/web/20150520124552/http://www.androidsnippets.com/autostart-an-application-at-bootup

Serampangan
sumber
File mana yang menjadi kode ini: BootUpReceiver kelas publik meluas BroadcastReceiver
Jeff Janes
Berhasil, terima kasih! (bekerja di Android 4.0.4 API level 15). Yup .. ini tahun 2017 dan saya masih harus mengembangkan untuk Android 4.0.4 .. :(
Luca
2
Tidak bekerja di Android 8.0! Bekerja di Android 4.0.
codezombie
saya menggunakan kode yang sama tetapi tidak bekerja untuk versi kitkat, saya ingin memulai aplikasi saat android tv start
Ashutosh Tripathi
@AshutoshTripathi, apakah Anda sudah memperbaikinya?
ralphgabb
10

Selain itu Anda dapat menggunakan aplikasi seperti AutoStart jika Anda tidak ingin memodifikasi kode, untuk meluncurkan aplikasi android saat startup: AutoStart - Tidak ada root

Tony
sumber
2

Solusi Sean awalnya tidak bekerja untuk saya (Android 4.2.2). Saya harus menambahkan aktivitas dummy ke proyek Android yang sama dan menjalankan aktivitas secara manual di perangkat setidaknya satu kali. Kemudian solusi Sean mulai bekerja dan BroadcastReceiver diberitahukan setelah reboot berikutnya.

ole
sumber
0

tangkapan layar

Saya ingin menambahkan satu poin dalam pertanyaan ini yang saya hadapi selama beberapa hari. Saya mencoba semua jawaban tetapi itu tidak berhasil untuk saya. Jika Anda menggunakan Android versi 5.1, silakan ubah pengaturan ini.

Jika Anda menggunakan Android versi 5.1 maka Anda harus memilih (Batasi untuk memulai) dari pengaturan aplikasi.

pengaturan> aplikasi> aplikasi Anda> Batasi untuk memulai (dis-pilih)

Manish Yadav
sumber
3
Saya tidak berpikir ini standar. Saya belum pernah mendengar "Restrict to launch". Tidak pernah melihatnya di Samsung, Asus, Sony yang berbeda ... Tidak masuk akal bagi saya. Dikatakan bahwa aplikasi hanya diperbolehkan untuk memulai? Apa artinya ini?
Luar biasa
0

Pendekatan lain adalah menggunakan android.intent.action.USER_PRESENTalih-alih android.intent.action.BOOT_COMPLETEDuntuk menghindari memperlambat selama proses boot. Tapi ini hanya truejika pengguna telah mengaktifkan Layar kunci - jika tidak, maksud ini tidak pernah disiarkan.

Referensi blog - Masalah dengan Maksud Android ACTION_USER_PRESENT

pengguna2627118
sumber
Jadi, dengan kata lain, itu tidak boleh digunakan
behelit