Ich entwickle eine einfache Chronometer-App, die einen Dienst verwendet (dies soll den Chronometer laufen lassen, selbst wenn die App geschlossen wurde).Android duplizierender Dienst in einigen Geräten
Die Chronometerlogik wird vom Dienst verarbeitet und mein Fragment bindet nur an den Dienst, um Daten zu erhalten. Mein Problem ist das, wenn ich den Chronometer starte und die App schließe. Wenn ich es wieder öffne, bindet der Chronometer an eine neue Instanz des Dienstes, so dass er denkt, dass er nicht läuft.
Das passiert nur in einem Gerät, das ich getestet habe (Im Emulator und 4 anderen Geräten funktioniert ok). Wie zum Teufel kann passieren? Hier
ist ein Code:
Fragment onStart
:
public void onStart() {
super.onStart();
Intent intent = createServiceIntent();
getActivity().startService(intent);
getActivity()
.bindService(
intent,
mServiceConnection,
Context.BIND_ABOVE_CLIENT
);
}
Service-Konstruktor, onCreate
, onStart
, onBind
und onUnbind
public ChronometerService() {
Log.d(Config.APP_TAG, "CREATING CHRONOMETER SERVICE INSTANCE");
}
@Override
public void onCreate()
{
super.onCreate();
this.mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
this.mBinder = new ChronometerBinder();
this.mPauses = new LinkedList<>();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId){
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
Log.d(Config.APP_TAG, "SERVICE BIND. AND WAS" + (mRunning ? "" : "N'T") + " RUNNING");
if(! mRunning) {
this.mPauseLength = 0;
this.mStoppedAt = 0;
this.mBase = 0;
}
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
if(! mRunning) {
stopForeground(true);
stopSelf();
}
return true;
}
Wenn der Start-Taste im Fragment abgegriffen wird, die Folgende Methode im Service heißt:
public void start() {
if(this.mBase == 0) {
reset();
this.mBase = now();
}else{
mPauseLength += now() - mStoppedAt;
}
Intent i = new Intent(this, MainActivity.class);
i.putExtra(MainActivity.CURRENT_FRAGMENT, MainActivity.CHRONOMETER_TAG);
PendingIntent intent = PendingIntent.getActivity(this, SERVICE_ID, i, PendingIntent.FLAG_UPDATE_CURRENT);
mNotificationBuilder = new NotificationCompat.Builder(this);
mNotificationBuilder.setContentTitle(getResources().getString(R.string.chronometer_title))
.setSmallIcon(R.drawable.ic_timer_white_48dp)
.setContentIntent(intent);
Notification n = mNotificationBuilder.build();
startForeground(SERVICE_ID, n);
mRunning = true;
update();
}
In der Vorrichtung, die die App ok läuft, im Protokoll I erhalten:
CREATING CHRONOMETER SERVICE INSTANCE
SERVICE BIND. AND WASN'T RUNNING
(Closing the app)
SERVICE BIND. AND WAS RUNNING
Im Gerät funktioniert es nicht erhalte ich:
CREATING CHRONOMETER SERVICE INSTANCE
SERVICE BIND. AND WASN'T RUNNING
(Closing the app)
CREATING CHRONOMETER SERVICE INSTANCE
SERVICE BIND. AND WASN'T RUNNING
Hoffnung, die Sie helfen können mich.
Ich denke, Sie müssen den Wert von 'mRunning' beibehalten. – muratgu