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_COMPLETED
Alı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 file
on public class
line almak. Herhangi bir fikir?
Bu nasıl olduğu aktiviteyiAndroid cihaz yeniden başlatıldıktan sonra başlatılmasını :
Bu kodu AndroidManifest.xml
dosyanı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:name
iç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:exported
ve android:permission
içinde <receiver>
etiketi zorunlu görünmüyor. Uygulama, bu değerler olmadan etkinliği alır. Buradaki örneğe bakın .
Application
mi? 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_PRESENT
yerine 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