Uygulamamı başlangıçta nasıl başlatırım?


241

Bu bağlantıda örnek kod kullanmayı denedim ama modası geçmiş gibi görünüyor ve işe yaramadı. Peki, Android önyükleme tamamlandığında hangi değişiklikleri yapmam ve uygulamamın otomatik olarak başlaması için hangi dosyaları kullanmalıyım?

Yanıtlar:


315

İ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.


8
Etkinlikler: developer.android.com/guide/topics/fundamentals/activities.html Hizmetler: developer.android.com/guide/topics/fundamentals/services.html Telefonunuz gerçekten başladığında uygulamanızı başlatmak için şunları yapmanız gerekir: hizmeti yukarıda gösterildiği gibi kaydettirin ve ardından uygulamanızı başlatmak için startActivity () kullanabilirsiniz. Yine de, istemediklerinde kullanıcının önüne bir ekran koymak iyi bir fikir değildir.
Sean Schulte

19
Sadece 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 .
brianestey

7
Amaç filtresi kullanılıyorsa amaç türünü kontrol etmek için bir neden var mı?
Ocak'ta Pijusn

1
Nedense ben 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?
pattyd

3
MySystemService nedir?
spor

120

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 .


Yerel bir hizmet yapmak zorunda kalmamak için bu "kısayol" seviyorum. Bu kod genişleyen sınıfa ait Applicationmi? Belki içeride onCreate()?
Birisi

2
kodun o paragraf içinde olmalıdır gibi görünüyor onReceive()aBroadcastReceiver
Someone Somewhere

2
Bu kod, BroadcastReceiver sınıfını ve onReceive () yöntemini genişleten "yourActivityrRunOnStartup" etkinliğinde olmalıdır.
thrylos

2
Ben 10 upvotes vermeye çalıştım ama could'nt. Üzgünüm ve teşekkürler.
Sayka

1
Bu benim için çalıştı, ancak SADECE niyet filtresinde sadece "<action android: name =" android.intent.action.BOOT_COMPLETED "/>" olsaydı. Diğer ikisini kullanırsam işe yaramadı.
emhomm4

67

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);  
        }

}

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


Bu dosya hangi kodda yer alıyor: public class BootUpReceiver BroadcastReceiver genişletiyor
Jeff Janes

Çalışıyor, teşekkürler! (android 4.0.4 API seviye 15 üzerinde çalıştı). Evet .. 2017 ve hala Android 4.0.4 için geliştirmem gerekiyor .. :(
Luca

2
Android 8.0'da çalışmıyor! Android 4.0'da çalışıyor.
codezombie

Ben aynı kodu kullanıyorum ama onun kitkat sürümü kadar çalışmıyor, ben android tv başladığında uygulamayı başlatmak istiyorum
Ashutosh Tripathi

@AshutoshTripathi bunu düzelttiniz mi?
ralphgabb

10

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


2

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.


0

ekran görüntüsü

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)


3
Bunun hiç standart olmadığını düşünmüyorum. "Başlatmayı kısıtla" yı hiç duymadım. Farklı Samsung, Asus, Sony'de hiç görmedim ... Benim için bir anlamı yok. Uygulamanın yalnızca başlamasına izin verildiğini söylüyor? Ne anlama geliyor?
İnanılmaz Ocak

0

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


Yani, başka bir deyişle, kullanılmamalıdır
18'de
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.