[OFFEN] Service wird bei manchen Geräten nicht gestartet

R

raffy123

Neues Mitglied
0
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

}
 
Hallo raffy123,

es hat ein wenig gedauert , bis ich Dir eine Antwort geben konnte, denn der obige Code ist zugegebener
Massen schon ein wenig unübersichtlich

Das was du dort kreiert hast, entspricht leider keinesfalls einer normalen Umsetzung und auch
die Anwendung des Alarmmanagers / Broadcast ist ein wenig ungewöhnlich - eigentlich eher falsch

a) Gibt es einen Grund warum du keinen klassischen Service mit z.b. START_STICKY verwendest ?
b) Wann beendest du den Service und auf welcher Grundlage ?
c) Warum ist der Alarmmanger im Service - was soll er dort bewältigen ?
d) Warum ist der BroadcastReceiver im Service ?

e)
Den Alarmmanger solltest du ausserhalb eher in dieser Richtung implementieren
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent UrlIntent = new Intent(context, service_url_request.class);
UrlIntent.setData(Uri.parse("custom://MY_SERVICE"));
UrlIntent.setAction("MY_SERVICE");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, myIntent, 0);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + start_zeitverzoegerung,interval * 60000,pendingIntent);

g) Das Gleiche gilt auch für den Broadcast Receiver


Ergo : So wie du es oben umgesetzt hast, ist mir fremd.
Es wundert mich eher, dass das überhaupt (manchmal) läuft

Leselektüre :
Services | Android Developers
Android Services - Tutorial
 
Zuletzt bearbeitet:
hallo swa00. danke für deine antwort. ein wenig unübersichtlich ist glaube ich bissle untertrieben hehe. naja danke dass du dir den code mal angeschaut hast.

a) ich hatte anfangs einen normalen service. dort trat aber das gleiche problem auf. ich googelte also und fand einen kommentar, der mir geraten hat einen intentservice zu verwenden. also kann ich weiterhin einen normalen service benutzen?

b) nachdem ich meine datenbank abgefragt habe beende ich den service mit stopself() und gebe return Start_Sticky zurück.

c)mit dem alarmmanager muss ich ja den den nächsten zeitpunkt der service ausführung angeben. er soll alle 10 minuten laufen. somit wird bei jedem service start gleich der nächste festgesetzt. wo sollte das rein wenn sich sonst nichts wiederholt? z.B setExact() bei älteren android versionen.

d) das hab ich aus einem beispiel. dort wird ein wake lock ausgeführt der im service wieder freigegeben wird.

e) ok alles klar.

ich werde mir deine leselektüre mal ansehen und dann etwas umstruckturieren. danke.
 

Ähnliche Themen

M
  • MikelKatzengreis
Antworten
10
Aufrufe
223
swa00
swa00
D
Antworten
17
Aufrufe
408
datNeMo
D
M
Antworten
3
Aufrufe
166
moin
M
Zurück
Oben Unten