Yanıtlar:
İlk olarak, aşağıdaki izinleri almanız gerekir AndroidManifest.xml:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Ayrıca,AndroidManifest.xml hizmetinizde tanımlayın ve BOOT_COMPLETED işlemini dinleyin :
<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>
O zaman alacak alıcı tanımlamak gerekir BOOT_COMPLETED eylemini ve hizmetinizi başlatacak .
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);
}
}
}
Ve şimdi telefon açıldığında hizmetiniz çalışıyor olmalıdır.
Intent.ACTION_BOOT_COMPLETEDAlıcınızdaki dizeyi kodlamak yerine kullanmanın daha iyi olacağını eklemek istedim . Ayrıca, Intent(context, MySystemService.class)Amaç oluştururken yeni yapıcı kullanmalısınız .
Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own fileon public classline almak. Herhangi bir fikir?
Bu nasıl olduğu aktiviteyiAndroid cihaz yeniden başlatıldıktan sonra başlatılmasını :
Bu kodu AndroidManifest.xmldosyanıza <application>öğenin içine yerleştirin (öğenin içinde değil<activity> ):
<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>
Ardından yeni bir sınıf oluşturmak yourActivityRunOnStartup(eşleştirme android:nameiçin belirtilen <receiver>manifest'te elemanı):
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);
}
}
}
Not: Çağrı i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Etkinlik önemlidir, çünkü etkinlik etkinlik dışındaki bir bağlamdan başlatılır. Bu olmadan etkinlik başlamaz.
Ayrıca, değerler android:enabled, android:exportedve android:permissioniçinde <receiver>etiketi zorunlu görünmüyor. Uygulama, bu değerler olmadan etkinliği alır. Buradaki örneğe bakın .
Applicationmi? Belki içeride onCreate()?
onReceive()aBroadcastReceiver
ACTION_BOOT_COMPLETE ürününü dinleyin ve buradan ihtiyacınız olanı yapın. Burada bir kod snippet'i var.
Güncelleme:
Yanıttaki orijinal bağlantı kesildi, bu nedenle yorumlara dayanarak, bağlantılı kod, çünkü bağlantılar kesildiğinde hiç kimse kodu kaçırmayacaktı.
AndroidManifest.xml'de (uygulama bölümü):
<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);
}
}
Ayrıca, kodu değiştirmek istemiyorsanız, başlangıçta bir android uygulaması başlatmak için AutoStart gibi bir uygulama kullanabilirsiniz: AutoStart - Kök yok
Sean'ın çözümü başlangıçta benim için işe yaramadı (Android 4.2.2). Aynı Android projesine sahte bir etkinlik eklemek ve etkinliği cihazda en az bir kez manuel olarak çalıştırmak zorunda kaldım. Sonra Sean'ın çözümü çalışmaya başladı ve sonraki yeniden başlatmalardan sonra BroadcastReceiver'a bildirildi.

Birkaç gün boyunca karşılaştığım bu soruya bir nokta eklemek istiyorum. Bütün cevapları denedim ama bunlar benim için işe yaramıyordu. Android 5.1 sürümünü kullanıyorsanız, lütfen bu ayarları değiştirin.
Android 5.1 sürümünü kullanıyorsanız, uygulama ayarlarından (Başlatmayı kısıtla) seçimini kaldırmanız gerekir.
ayarlar> uygulama> uygulamanız> Başlatmayı kısıtla (seçimi kaldır)
Başka bir yaklaşım, önyükleme işlemi sırasında yavaşlamaları önlemek android.intent.action.USER_PRESENTyerine kullanmaktır android.intent.action.BOOT_COMPLETED. Ama bu sadecetrue kullanıcı Kilit Ekranını etkinleştirdiyse, aksi takdirde bu amaç hiçbir zaman yayınlanmaz.
Referans blog - Android'in ACTION_USER_PRESENT Niyetiyle İlgili Sorun