Proberen een service te starten bij opstarten op Android

Ik heb geprobeerd een service te starten wanneer een apparaat opstart op Android, maar ik krijg het niet werkend. Ik heb online een aantal links bekeken, maar geen van de code werkt. Vergeet ik iets?

AndroidManifest.xml

<receiver
    android:name=".StartServiceAtBootReceiver"
    android:enabled="true"
    android:exported="false"
    android:label="StartServiceAtBootReceiver" >
    <intent-filter>
        <action android:name="android.intent.action._BOOT_COMPLETED" />
    </intent-filter>
</receiver>
<service
    android:name="com.test.RunService"
    android:enabled="true" />

BroadcastReceiver

public void onReceive(Context context, Intent intent) {
    if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
        Intent serviceLauncher = new Intent(context, RunService.class);
        context.startService(serviceLauncher);
        Log.v("TEST", "Service loaded at start");
    }
}

Antwoord 1, autoriteit 100%

De andere antwoorden zien er goed uit, maar ik dacht dat ik alles in één compleet antwoord zou samenvatten.

Je hebt het volgende nodig in je AndroidManifest.xml-bestand:

  1. In uw <manifest>element:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    
  2. In uw <application>-element (gebruik een volledig gekwalificeerde [of relatieve] klassenaam voor uw BroadcastReceiver):

    <receiver android:name="com.example.MyBroadcastReceiver">  
        <intent-filter>  
            <action android:name="android.intent.action.BOOT_COMPLETED" />  
        </intent-filter>  
    </receiver>
    

    (u hebt de kenmerken android:enabled, exported, enz. niet nodig: de Android-standaardinstellingen zijn correct)

    In MyBroadcastReceiver.java:

    package com.example;
    public class MyBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Intent startServiceIntent = new Intent(context, MyService.class);
            context.startService(startServiceIntent);
        }
    }
    

Van de oorspronkelijke vraag:

  • het is niet duidelijk of het element <receiver>in het element <application>zat
  • het is niet duidelijk of de juiste volledig gekwalificeerde (of relatieve) klassenaam voor de BroadcastReceiveris opgegeven
  • er was een typfout in de <intent-filter>

Antwoord 2, autoriteit 14%

Als aanvullende informatie: BOOT_COMPLETE wordt verzonden naar applicaties voordatexterne opslag wordt aangekoppeld. Dus als de applicatie op externe opslag is geïnstalleerd, ontvangt deze geen BOOT_COMPLETE broadcast-bericht.

Meer details hierin sectie Uitzending Ontvangers luisteren naar “opstart voltooid”


Antwoord 3, autoriteit 12%

De service starten bij het opstarten van het apparaat (autorun-app, enz.)

Ten eerste: sinds versie Android 3.1+ ontvangt u BOOT_COMPLETE niet als de gebruiker uw app niet minstens één keer heeft gestart of als de gebruiker de app geforceerd heeft gesloten.
Dit is gedaan om te voorkomen dat malware automatisch de service registreert. Dit beveiligingslek is gedicht in nieuwere versies van Android.

Oplossing:

Maak een app met activiteit. Wanneer de gebruiker het eenmaal uitvoert, kan de app BOOT_COMPLETE broadcast-bericht ontvangen.

Ten tweede: BOOT_COMPLETE wordt verzonden voordat externe opslag wordt aangekoppeld. Als de app is geïnstalleerd op externe opslag, ontvangt deze geen BOOT_COMPLETE broadcast-bericht.

In dit geval zijn er twee oplossingen:

  1. Installeer je app in de interne opslag
  2. Installeer nog een kleine app in de interne opslag. Deze app ontvangt BOOT_COMPLETE en voert de tweede app uit op externe opslag.

Als je app al in de interne opslag is geïnstalleerd, kan de onderstaande code je helpen te begrijpen hoe je de service kunt starten bij het opstarten van het apparaat.


In Manifest.xml

Toestemming:

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

Registreer uw BOOT_COMPLETED ontvanger:

<receiver android:name="org.yourapp.OnBoot">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

Registreer uw service:

<service android:name="org.yourapp.YourCoolService" />

In ontvanger OnBoot.java:

public class OnBoot extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        // Create Intent
        Intent serviceIntent = new Intent(context, YourCoolService.class);
        // Start service
        context.startService(serviceIntent);
    }
 }

Voor HTC moet je misschien ook deze code toevoegen als het apparaat RECEIVE_BOOT_COMPLETED niet opvangt:

<action android:name="android.intent.action.QUICKBOOT_POWERON" />

Ontvanger ziet er nu als volgt uit:

<receiver android:name="org.yourapp.OnBoot">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    </intent-filter>
</receiver>

Hoe BOOT_COMPLETED testen zonder herstartemulator of echt apparaat?
Het is makkelijk. Probeer dit:

adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED

Hoe krijg ik een apparaat-ID? Krijg een lijst met verbonden apparaten met id’s:

adb devices

adb in ADT is standaard te vinden in:

adt-installation-dir/sdk/platform-tools

Veel plezier! )


Antwoord 4, autoriteit 6%

Samen met

<action android:name="android.intent.action.BOOT_COMPLETED" />  

gebruik ook,

<action android:name="android.intent.action.QUICKBOOT_POWERON" />

HTC-apparaten lijken BOOT_COMPLETED niet te vangen


Antwoord 5, autoriteit 3%

merk op dat er aan het begin van de vraag een typefout staat:

<action android:name="android.intent.action._BOOT_COMPLETED"/>

in plaats van:

<action android:name="android.intent.action.BOOT_COMPLETED"/>

een kleine “_” en al deze problemen 🙂


Antwoord 6, autoriteit 2%

Ik denk dat je manifest het volgende moet toevoegen:

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

Antwoord 7, autoriteit 2%

Ik kwam er net achter dat dit zou kunnen komen door de optie Fast Bootin Settings> Power

Als ik deze optie uit heb, ontvangt mijn applicatie deze uitzending, maar niet anders.

Trouwens, ik heb Android 2.3.3op HTC Incredible S.

Hopelijk helpt het.


Antwoord 8

Na alle genoemde antwoorden en trucs te hebben geprobeerd, kom ik er eindelijk achter waarom de code niet werkt op mijn telefoon. Sommige Android-telefoons zoals “Huawei Honor 3C Android 4.2.2” hebben een Statup Manager-menu in hun instellingen en je app moet in de lijst worden aangevinkt.
🙂


Antwoord 9

Ik heb een extra <category>-tag, weet niet of dat verschil maakt.

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

Heb je geprobeerd de if-clausule "android.intent.action.BOOT_COMPLETED".equals(intent.getAction()weg te laten, aangezien de ontvanger die intentie waarschijnlijk toch alleen ontvangt?


Antwoord 10

Dit is wat ik deed

1. Ik heb de klasse Ontvanger gemaakt

public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //whatever you want to do on boot
       Intent serviceIntent = new Intent(context, YourService.class);
       context.startService(serviceIntent);
    }
}

2.in het manifest

<manifest...>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <application...>
        <receiver android:name=".BootReceiver" android:enabled="true" android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    ...

3.en na ALLES dat je de ontvanger MOET “instellen” in je MainActivity, kan deze zich in de onCreate

bevinden

...
 final ComponentName onBootReceiver = new ComponentName(getApplication().getPackageName(), BootReceiver.class.getName());
        if(getPackageManager().getComponentEnabledSetting(onBootReceiver) != PackageManager.COMPONENT_ENABLED_STATE_ENABLED)
        getPackageManager().setComponentEnabledSetting(onBootReceiver,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);
...

de laatste stap die ik heb geleerd van ApiDemos


Antwoord 11

Raadpleeg deze link http://khurramitdeveloper .blogspot.in/2013/06/start-activity-or-service-on-boot.html
Stap voor stap procedure om boot on Service te gebruiken


Antwoord 12

Voordat externe opslag wordt gemount, wordt BOOT_COMPLETE naar execute gestuurd. Als je app op externe opslag is geïnstalleerd, ontvangt deze geen BOOT_COMPLETE broadcast-bericht. Om dit te voorkomen kunt u uw applicatie in de interne opslag installeren. je kunt dit doen door deze regel toe te voegen in menifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="internalOnly"
... >

Sommige HTC-apparaten kunnen een “snel opstarten”-functie inschakelen die meer lijkt op een diepe slaapstand en niet op een echte herstart, en zou daarom niet de bedoeling van BOOT_COMPLETE moeten zijn. Om dit te herstellen, kunt u dit intentiefilter in uw ontvanger toevoegen:

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

Antwoord 13

Als je Android Studio gebruikt en je bent dol op automatisch aanvullen, dan moet ik je laten weten dat ik Android Studio v 1.1.0 gebruik en automatisch aanvullen heb gebruikt voor de volgende toestemming

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

En Android Studio Auto-completedreceive_boot_completedallemaal in kleine letters zoals receive_boot_completeden ik bleef maar aan mijn haren trekken omdat ik mijn checklist al had ingevuld doen om de service bij het opstarten te starten. Ik heb zojuist opnieuw bevestigd

Android Studio voltooit deze toestemming WEL automatisch in kleine letters.


Antwoord 14

Zoals @Damian opmerkte, doen alle antwoorden in deze thread het verkeerd. Als u het op deze manier handmatig doet, loopt u het risico dat uw service halverwege wordt gestopt vanaf het apparaat dat in slaap valt. U moet eerst een wake lock verkrijgen. Gelukkig is de Ondersteuningsbibliotheek geeft ons een lesom dit te doen:

public class SimpleWakefulReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // This is the Intent to deliver to our service.
        Intent service = new Intent(context, SimpleWakefulService.class);
        // Start the service, keeping the device awake while it is launching.
        Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime());
        startWakefulService(context, service);
    }
}

Zorg er dan in uw Service voor dat u de wake lock ontgrendelt:

   @Override
    protected void onHandleIntent(Intent intent) {
        // At this point SimpleWakefulReceiver is still holding a wake lock
        // for us.  We can do whatever we need to here and then tell it that
        // it can release the wakelock.
...
        Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime());
        SimpleWakefulReceiver.completeWakefulIntent(intent);
    }

Vergeet niet om de WAKE_LOCK permssion toe te voegen aan je mainfest:

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

Antwoord 15

In feite ben ik niet zo lang geleden in deze problemen gekomen, en het is echt heel gemakkelijk op te lossen, je doet eigenlijk niets verkeerd als je de "android.intent.action.BOOT_COMPLETED"toestemming instelt en intentie-filter.

Houd er rekening mee dat als u op Android 4.X de broadcast-listener moet uitvoeren voordat u de service bij het opstarten start, dat betekent dat u eerst een activiteit moet toevoegen. je had echter verwacht op Android 4.X, ik heb geen manier gevonden om de service bij het opstarten te starten zonder enige activiteit, ik denk dat Google dat om veiligheidsredenen heeft gedaan.


Antwoord 16

Ik heb met dit probleem te maken gehad als ik de lege constructor in de ontvangerklasse laat. Na het verwijderen van de lege contsructor begon de onRreceive-methode goed te werken.

Other episodes