Service wird bei manchen Geräten nicht gestartet

  • Antworten:0
Raffy
  • Forum-Beiträge: 1

02.04.2017, 14:52:28 via Website

Hallo. Ich will in meiner App einen Service laufen lassen, welcher alle 10 Minuten Daten vom Server abfrägt. Auf meinem Handy OnePlus 3 und auf einem Samsung Galaxy S3 funktioniert es ohne Probleme.
Auf einem Samsung Galaxy S6 wird der Service nicht gestartet. Auf einem HTC Gerät wird der Service manchmal nur alle 20 Minuten ausgeführt, statt alle 10 Minuten. Ich habe schon viele Ansätze probiert komme aber leider nicht auf die Lösung. Ich habe einen BootReceiver angelegt, sowie einen wenn man die App über den PlayStore aktualisiert. Zur Sicherheit habe ich dem Receiver noch gesagt, er soll auch starten, wenn das Handy am Strom angeschlossen ist. Nachfolgend mein Code. Seht ihr hier vielleicht etwas, warum es auf manchen Geräten nicht funktioniert. An der Android Version liegt es meines Erachtens nicht.

Manifest

` android:enabled="true"
android:exported="true"
/>

    <receiver android:name="BootCompleteReceiver">
        <intent-filter>
            <action android:name= "android.intent.action.BOOT_COMPLETED"/>
            <action android:name= "android.intent.action.REBOOT"/>
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            <action android:name="android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE" />
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
            <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
        </intent-filter>
    </receiver>

    <receiver android:name="AppUpdateReceiver" >
        <intent-filter>
            <!--other actions I need-->
            <action android:name="android.intent.action.PACKAGE_REPLACED" />
            <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
            <action android:name="android.intent.action.PACKAGE_CHANGED" />
            <action android:name="android.intent.action.PACKAGE_INSTALL" />
        </intent-filter>
    </receiver>

   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.REBOOT" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

`

AppUpdateReceiver

public class AppUpdateReceiver extends WakefulBroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    Intent startServiceIntent = new Intent(context, HintergrundService.class);
    startWakefulService(context, startServiceIntent);
}

}

BootReceiver

public class BootCompleteReceiver extends WakefulBroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    Intent startServiceIntent = new Intent(context, HintergrundService.class);
    startWakefulService(context, startServiceIntent);
}

}

HintergrundService

public class HintergrundService extends IntentService {
public HintergrundService() {
super("Hintergrundservice");
}

protected void onHandleIntent(Intent intent) {
    // Release the wake lock provided by the WakefulBroadcastReceiver.
    WakefulBroadcastReceiver.completeWakefulIntent(intent);
}

public void onDestroy(){
    if(Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT){
        //unter 4.4
        AlarmManager alarmmanager = (AlarmManager) HintergrundService.this.getSystemService(HintergrundService.this.ALARM_SERVICE);
        Intent startServiceIntent = new Intent(HintergrundService.this, HintergrundService.class);
        PendingIntent startServicePendingIntent = PendingIntent.getService(HintergrundService.this, 0, startServiceIntent, 0);
        long nextStart;

        if(MainActivity.debugMode){
            nextStart = System.currentTimeMillis() + 1000 * 60 * 1;
        }else{
            nextStart = System.currentTimeMillis() + 1000 * 60 * 10;
        }

        alarmmanager.cancel(startServicePendingIntent);
        alarmmanager.set(AlarmManager.RTC_WAKEUP, nextStart, startServicePendingIntent);

    }else if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M){
        //ab 4.4 bis 5.1.1
        AlarmManager alarmmanager = (AlarmManager) HintergrundService.this.getSystemService(HintergrundService.this.ALARM_SERVICE);
        Intent startServiceIntent = new Intent(HintergrundService.this, HintergrundService.class);
        PendingIntent startServicePendingIntent = PendingIntent.getService(HintergrundService.this, 0, startServiceIntent, 0);
        long nextStart;

        if(MainActivity.debugMode){
            nextStart = System.currentTimeMillis() + 1000 * 60 * 1;
        }else{
            nextStart = System.currentTimeMillis() + 1000 * 60 * 10;
        }

        alarmmanager.cancel(startServicePendingIntent);
        alarmmanager.setExact(AlarmManager.RTC_WAKEUP, nextStart, startServicePendingIntent);
    }else{
        //ab 6.0
        AlarmManager alarmmanager = (AlarmManager) HintergrundService.this.getSystemService(HintergrundService.this.ALARM_SERVICE);
        Intent startServiceIntent = new Intent(HintergrundService.this, HintergrundService.class);
        PendingIntent startServicePendingIntent = PendingIntent.getService(HintergrundService.this, 0, startServiceIntent, 0);
        long nextStart;

        if(MainActivity.debugMode){
            nextStart = System.currentTimeMillis() + 1000 * 60 * 1;
        }else{
            nextStart = System.currentTimeMillis() + 1000 * 60 * 10;
        }

        alarmmanager.cancel(startServicePendingIntent);
        alarmmanager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, nextStart, startServicePendingIntent);
    }
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

my stuff

}

Antworten