Как остановить/запустить службу, которая содержит бесконечный цикл при создании

Итак, для фона я пытаюсь создать приложение, которое непрерывно записывает через микрофон и сохраняет данные в буфере. Цель программы состоит в том, чтобы выполнить некоторую обработку данных в буфере и воздействовать на нее. В настоящее время приложение просто считывает данные в буфер и записывает их как можно скорее. При запуске приложения можно было говорить в микрофон, а затем слышать то, что вы только что говорили, на другом конце.

Вот тут-то и начинает проявляться мой неопытный опыт работы с Android. Я провожу операцию чтения и записи как бесконечный цикл. Ниже приведена служба:

public class AudioService extends Service {

private final int MIC = AudioSource.MIC;
private final int SAMPLE = 44100;
private final int CHANNELI = AudioFormat.CHANNEL_IN_MONO;
private final int CHANNELO = AudioFormat.CHANNEL_OUT_MONO;
private final int FORMAT = AudioFormat.ENCODING_PCM_16BIT;
private final int BUFFERSIZE = AudioRecord.getMinBufferSize(SAMPLE,
        CHANNELI, FORMAT);
private final int STREAM = AudioManager.STREAM_MUSIC;
private final int MODE = AudioTrack.MODE_STREAM;
private boolean play = true;

AudioRecord recorder = null;
AudioTrack track = null;

short[] buffer = null;

public void OnCreate() {

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    recorder = new AudioRecord(MIC, SAMPLE, CHANNELI, FORMAT, BUFFERSIZE);
    track = new AudioTrack(STREAM, SAMPLE, CHANNELO, FORMAT, BUFFERSIZE,
            MODE);
    buffer = new short[BUFFERSIZE];
    recorder.startRecording();
    track.play();

    while (play) {
        recorder.read(buffer, 0, buffer.length);
        track.write(buffer, 0, buffer.length);
    }
    return START_STICKY;
}

Эта служба вызывается при нажатии кнопки «Запись» в действии. Я хочу иметь возможность щелкнуть запись и иметь возможность нажать кнопку «Отмена», чтобы остановить этот цикл. Слушатель ниже, который реализует это:

private OnClickListener Recording = new OnClickListener() {
    public void onClick(View v) {

        serviceIntent = new Intent(getApplicationContext(),
                AudioService.class);
        serviceIntent.putExtra("extraData", "somedata");
        startService(serviceIntent);

        record.setEnabled(false);
        cancel.setEnabled(true);
        cancel.requestFocus();

};

И теперь проблема становится очевидной. Приложение не может завершить выполнение, когда оно достигает startService(serviceIntent) и просто зависает в балансе.

Итак, каков мой регресс? Я думал о каком-то способе управления службой из бесконечного цикла, но мой неопытный опыт работы с Android заставляет меня задуматься, как это сделать.Спровоцировать какой-либо способ взлома, возможно, создав новую кнопку внутри цикла; поэтому во время startIntent я смогу вырваться из цикла и «покончить с безумием».

Будем признательны за любую помощь. Я также понимаю, что эту службу следует запускать в отдельном потоке от пользовательского интерфейса, чтобы избежать проблемы «Приложение не отвечает ...», но это уже другая тема. Моя главная цель на данный момент - выйти из цикла, и я был бы признателен за любую помощь или указание о том, как это сделать.

5
задан Gray 31 May 2012 в 23:45
поделиться