Aktivität ausgetreten IntentReceiver, die ursprünglich hier angemeldet. Vermissen Sie einen Anruf zu unregisterReceiver()?
Bin ich über einen Dienst, um updates von der Lage, ist es NICHT ein IntentService, aber die log sagt, dass Aktivität ausgetreten IntentReceiver, die ursprünglich hier angemeldet. Vermissen Sie einen Anruf zu unregisterReceiver()?
Ich glaube nicht, verwenden Sie einen Empfänger, damit ich nicht registrieren oder aufheben der Registrierung. Dann, Was ist Los mit diesem?
Ich füge meinen code für den Service:
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
public class UpdateService2 extends Service {
private LocationManager locManager;
private LocationListener locListener;
private Location loc;
public static int UPDATE_TIME = 30000;
public static long MAX_TIME = 600000;
public static long waited = 0;
boolean active = true;
String TAG = "UpdateService2";
Thread myThread;
SharedPreferences prefs;
SharedPreferences.Editor editor;
@Override
public IBinder onBind(Intent arg0) {
Log.d(TAG, "onBind");
return null;
}
public void onCreate() {
Log.d(TAG, "onCreate");
SharedPreferences prefs = getSharedPreferences(MyConstants.MY_PREFERENCES,Context.MODE_PRIVATE);
editor = prefs.edit();
startGettingLocation();
Log.d("UpdateService","Thread - active:"+active+", maxTime: "+MAX_TIME);
myThread = new Thread() {
public void run(){
Log.d("UpdateService","run");
try {
waited = 0;
Log.d("UpdateService","Thread - active:"+active+", maxTime: "+MAX_TIME+", waited: "+waited);
while(active && (waited < MAX_TIME)) {
sleep(10000);
if(active) {
waited += 10000;
Log.d("UpdateService","Thread update: "+waited/1000+" seg");
}
}
} catch(InterruptedException e) {
Log.d("UpdateService","Exception: "+e.toString());
} finally {
interrupt();
}
}
};
}
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy");
active = false;
}
@Override
public void onStart(Intent intent, int startid) {
myThread.start();
Log.d(TAG, "onStart");
}
private void startGettingLocation(){
try {
locListener = new LocationListener() {
public void onLocationChanged(Location location) {
updatePosition(location);
Log.d("UpdateService","Update location - Lat:"+location.getLatitude()+", Lon:"+location.getLongitude());
}
public void onProviderDisabled(String provider){
}
public void onProviderEnabled(String provider){
}
public void onStatusChanged(String provider, int status, Bundle extras){
}
};
locManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, UPDATE_TIME, 0, locListener);
loc = locManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (loc != null) {
updatePosition(loc);
}
} catch (Exception e){
Log.d("UpdateService", e.toString());
}
}
private void updatePosition(Location loc) {
if(loc != null) {
Double dLat = loc.getLatitude();
Double dLon = loc.getLatitude();
editor.putInt(MyConstants.PREFERENCES_LAT, dLat.intValue());
editor.putInt(MyConstants.PREFERENCES_LON, dLon.intValue());
editor.commit();
}
}
}
Dann der Anruf vom activity onCreate ist wie folgt:
msgIntent = new Intent(this, UpdateService2.class);
startService(msgIntent);
Und der Aufruf von onDestroy ist wie folgt:
stopService(msgIntent);
- Reduzieren Sie bitte Ihren code auf die relevanten Teile, wenn möglich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eigentlich (glaube ich), die Sie implizit registriert ein Empfänger im
requestLocationUpdates
:Sollten Sie später anrufen
removeUpdates
:onDestroy
. Dies wird nur aufgerufen werden, wenn Ihre service "wird nicht mehr verwendet und wurde entfernt".Dies ist "meine" Lösung (es kommt wirklich von hier: Alarme):
Manifest auf, ich melde mich mein broadcast receiver:
Ist die Implementierung des Empfängers:
Konstanten, die ich verwenden (in einer anderen Klasse):
Klasse MyLocation, wich ist die eine, die ich nennen, die aus den Aktivitäten:
Ich die Verweise von Längen-und Breitengrad in den Einstellungen haben einfachen Zugriff von der app auf diese Daten.
Schließlich, dies ist der Aufruf von der Aktivität zu beginnen, immer meine Position:
In diesem Fall, ich habe gerade einen alarm von 30 Sekunden nach dem Moment, dass ich tun, aber dieses Verhalten ist einfach zu Programmieren-Alarme zu wiederholen, beliebig oft.
Und dies ist die Methode, die ich verwenden, um stärket ein alarm, wacht das system, auch wenn die app geschlossen ist: