Maison >Java >javaDidacticiel >Pourquoi mon service Android ne démarre-t-il pas au démarrage ?

Pourquoi mon service Android ne démarre-t-il pas au démarrage ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-12 20:42:18815parcourir

Why Isn't My Android Service Starting on Boot?

Démarrer un service au démarrage d'Android

La mise en œuvre de la configuration correcte pour démarrer automatiquement un service au démarrage du système d'exploitation Android est cruciale. Même si tout semble être configuré correctement, il peut y avoir des problèmes sous-jacents empêchant le comportement souhaité.

Manifeste Android

Consultez le manifeste Android fourni :

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.phx.batterylogger"
  android:versionCode="1"
  android:versionName="1.0"
  android:installLocation="internalOnly">

<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BATTERY_STATS" />

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <service android:name=".BatteryLogger"/>
    <receiver android:name=".StartupIntentReceiver">  
        <intent-filter>  
            <action android:name="android.intent.action.BOOT_COMPLETED" />  
        </intent-filter>  
    </receiver>
</application>

</manifest>

Assurez-vous que l'action BOOT_COMPLETED est enregistrée dans le IntentReceiver.

BroadcastReceiver for Startup

Ensuite, vérifiez le StartupIntentReceiver :

package com.phx.batterylogger;

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

public class StartupIntentReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent serviceIntent = new Intent(context, BatteryLogger.class);
        context.startService(serviceIntent);
    }
}

Ce récepteur devrait écouter l'action BOOT_COMPLETED et démarrer le voulu service.

Dépannage

Si le service ne démarre pas au démarrage, envisagez les étapes suivantes :

  • Vérifiez que les journaux indiquent le le récepteur reçoit la diffusion BOOT_COMPLETED.
  • Vérifiez que le service cible est correctement déclaré et configuré dans le Manifeste.
  • Assurez-vous que le service cible n'est pas désactivé ou optimisé par le système.
  • Envisagez d'utiliser l'API Context.startForegroundService(Intent intent, int notificationId) pour démarrer le service au premier plan ( disponible au niveau API 26 et supérieur).

Complet Exemple

Pour un exemple complet d'application AutoStart, reportez-vous au code suivant extrait :

AndroidManifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="pack.saltriver" android:versionCode="1" android:versionName="1.0">

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

    <application android:icon="@drawable/icon" android:label="@string/app_name">

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

        <activity android:name=".hello"></activity>
        <service android:enabled="true" android:name=".service" />
    </application>
</manifest>

autostart.java

public class autostart extends BroadcastReceiver 
{
    public void onReceive(Context context, Intent arg1) 
    {
        Intent intent = new Intent(context,service.class);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            context.startForegroundService(intent);
        } else {
            context.startService(intent);
        }
        Log.i("Autostart", "started");
    }
}

service.java

public class service extends Service
{
    private static final String TAG = "MyService";
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    public void onDestroy() {
        Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onDestroy");
    }

    @Override
    public void onStart(Intent intent, int startid)
    {
        Intent intents = new Intent(getBaseContext(),hello.class);
        intents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intents);
        Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onStart");
    }
}

hello.java

public class hello extends Activity 
{   
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Toast.makeText(getBaseContext(), "Hello........", Toast.LENGTH_LONG).show();
    }
}

Implémentation ces étapes devraient garantir que votre service Android démarre correctement au démarrage du système d'exploitation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn