2016-05-15 12 views
0

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.

+0

Ich denke, Sie müssen den Wert von 'mRunning' beibehalten. – muratgu

Antwort

0

GELÖST:

Das Problem war doch nicht mein Code. Das Problem war Purify

Es tötete meinen Dienst. Nach dem Hinzufügen meiner App zur Whitelist wurde das Problem gelöst.