2016-03-31 5 views
0

Ich kann nicht scheinen, diese herauszufinden. Ich habe einen broadcastReceiver, der im Manifest registriert ist. Ich ping für gps einmal pro Minute, der onReceive des broadcastReceivers wird ausgelöst und startet einen Dienst. Dieser Service ergreift für alle Fälle ein Wakelock, sendet die GPS Coords über eine ASyncTask an unseren Server und gibt den Wakelock frei und ruft stopSelf() auf. Dieser feuert ständig auf meinem Nexus 6p und einem HTC.Android Samsung Handy stoppt Broadcastreceiver von Updates zufällig bekommen

Aber auf einem Samsung GS5 funktioniert das nur so lange. Die Zeit, die es aufhört, scheint zufällig, aber normalerweise innerhalb von 30 Minuten, manchmal so kurz wie 5 Minuten. Der broadcastReceiver wird nie wieder aufgerufen, dh der onReceive hört einfach auf zu feuern.

Alle Energiespareinstellungen auf der Samsung sind ausgeschaltet, die ich bemerken kann. Es sei denn, es gibt einen super trickreichen versteckten, ich kann nicht herausfinden, wie das Samsung Handy diesen broadcastReceiver stoppen kann, oder GPS stoppen, was auch immer passiert.

Dies passiert auch, wenn die App nicht geschlossen wird. Das Telefon geht in den Ruhezustand, der Bildschirm wird ausgeschaltet, und etwa 5-30 Minuten später hört das Telefon auf, sich anzupassen.

Dies passiert, ob ich GPS_PROVIDER oder NETWORK_PROVIDER verwenden, obwohl mit Netzwerk-Provider scheint es noch schneller passieren.

Hier starte ich das GPS.

public void startBackgroundGPS() { 

    Activity activity = this.cordova.getActivity(); 
    Context context = activity.getApplicationContext(); 

    ComponentName component = new ComponentName(context, LocationReceiver.class); 
    int status = context.getPackageManager().getComponentEnabledSetting(component); 
    Log.d(TAG, Integer.toString(status)); 
    if(status == PackageManager.COMPONENT_ENABLED_STATE_ENABLED || status == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) { 
     Log.d(TAG, "receiver is enabled"); 
     //getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED , PackageManager.DONT_KILL_APP); 
    } else if(status == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) { 
     Log.d(TAG, "receiver is disabled"); 
     context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_ENABLED , PackageManager.DONT_KILL_APP); 
    } 

    Intent intent = new Intent(context, LocationReceiver.class); 
    intent.setAction("myBroadcast"); 
    intent.putExtra("session_id", session_id); 
    intent.putExtra("device_id", device_id); 
    //intent.addFlags(Intent.FLAG_FROM_BACKGROUND); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(activity.getApplicationContext(), 58534, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

    //Register for broadcast intents 
    locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE); 
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60000, 0, pendingIntent); 

} 

Hier ist meine broadcastReceiver

public class LocationReceiver extends BroadcastReceiver { 
//private static boolean semaphore = true; 
@Override 
public void onReceive(Context context, Intent intent) { 

    Log.d("DistanceFilterLocationService", intent.getAction()); 


    Location location = (Location) intent.getExtras().get(android.location.LocationManager.KEY_LOCATION_CHANGED); 

    Intent locationServiceIntent = new Intent(context, DistanceFilterLocationService.class); 
    locationServiceIntent.putExtra("device_id", intent.getStringExtra("device_id")); 
    locationServiceIntent.putExtra("session_id", intent.getStringExtra("session_id")); 

    Double longi = location.getLongitude(); 
    Double lati = location.getLatitude(); 
    locationServiceIntent.putExtra("longitude", longi); 
    locationServiceIntent.putExtra("latitude", lati); 
    locationServiceIntent.putExtra("accuracy", location.getAccuracy()); 
    locationServiceIntent.putExtra("time", location.getTime()); 
    context.startService(locationServiceIntent); 
} 
} 

Hier mein broadcastreceiver im Manifest ist.

<receiver android:name="com.mypackage.LocationReceiver"> 
     <intent-filter> 
      <action android:name="myBroadcast" /> 
     </intent-filter> 
    </receiver> 

Wer in so etwas gelaufen? Ich fand ein paar ähnliche Fragen, aber keine Antworten wurden gegeben. Dieser tötet mich, da es den Zweck der App auf Samsung-Handys völlig zerstört.

Danke für jede Hilfe.

Antwort

0

Vielleicht ist es keine gute Antwort, aber vielleicht könnte die Android-Version das Problem sein. Oder vielleicht ein paar Addons von Samsung ... hast du auf einem anderen Samsung Handy getestet (vielleicht eine andere Android Version)?

Verwandte Themen