2017-01-08 3 views
1

Ich möchte einen Dienst starten und Audio aufnehmen und dann schließen Sie die Aktivität, sondern weiterhin die Aufnahme, und öffnen Sie dann die Aktivität und die Aufzeichnung zu stoppen.Kontrolle Service während der Aufnahme von Audio

das ist mein Service:

public class RecorderService extends Service { 

private Thread mThread; 

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    mThread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      startRecording(); 
     } 
    }); 
    mThread.start(); 
    return super.onStartCommand(intent, flags, startId); 
} 

@Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    mThread = null; 
    super.onDestroy(); 
} 
} 

dies mein Code, um den Dienst zu starten und zu stoppen:

Button recordAudioButton = (Button) findViewById(R.id.recordAudioButton); 
    recordAudioButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      startService(new Intent(getApplicationContext(), RecorderService.class)); 

     } 
    }); 

    Button buttonPLay = (Button) findViewById(R.id.buttonPLay); 
    buttonPLay.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      stopService(new Intent(getApplicationContext(), RecorderService.class)); 

     } 
    }); 

es beginnt, aber wenn ich den Dienst beenden es nicht zu stoppen. Was mache ich falsch?

+0

Wie verstehen Sie diesen Dienst nicht stoppen? – Divers

Antwort

1

Das Problem ist, dass, obwohl Sie die mThread = null; einstellen, müssen Sie auch zuerst aufhören. Weitere Informationen zum Anhalten eines Threads finden Sie unter android best and safe way to stop thread.

Sie zum Beispiel versuchen, die onStartCommand und onDestory an sich ändernde:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    mThread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      if (Thread.currentThread().isInterrupted()) { 
       return; 
      } 

      startRecording(); 
     } 
    }); 
    mThread.start(); 
    return super.onStartCommand(intent, flags, startId); 
} 

@Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    mThread.interrupt(); 
    mThread = null; 
    super.onDestroy(); 
} 
+0

Das check 'if (Thread.currentThread(). IsInterrupted())' - fast sinnlos an dieser Stelle des Codes – Divers

Verwandte Themen