Android: сохранить фрагмент в фоновом режиме - PullRequest
1 голос
/ 19 января 2020

У меня есть фрагмент, который начинает отсчет и изменяет статус значка. После открытия приложения появляется счетчик - 00:00 и кнопка с надписью START.

После нажатия кнопки START отсчет начинается и кнопка меняется на STOP.

После нажатия кнопки STOP отсчет останавливается, и кнопка изменяется на START. Довольно просто c.

Дело в том, что после нажатия кнопки «СТАРТ» и минимизации приложения и его открытия обратно (перевод приложения в фоновый режим и обратно) счетчик и кнопка всегда возвращаются к СТАРТУ и 00:00.

Итак, вопрос: Как сохранить фрагмент живым после минимизации приложения?

Код:

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View recordView = inflater.inflate(R.layout.fragment_record, container, false);
        ButterKnife.bind(this, recordView);
        return recordView;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        btnPause.setVisibility(View.GONE);
        recordBtn.setColorPressed(getResources().getColor(R.color.colorPrimary));
    }

    @OnClick(R.id.btnRecord)
    public void recordAudio(){
        onRecord(mStartRecording);
        mStartRecording = !mStartRecording;
    }

    private void onRecord(boolean start) {
        Intent intent = new Intent(getActivity(), RecordingService.class);

        if(start){
            recordBtn.setImageResource(R.drawable.ic_media_stop);

            //Toast.makeText(getContext(), "Started recording", Toast.LENGTH_LONG).show();

            chronometer.setBase(SystemClock.elapsedRealtime());
            chronometer.start();

            getActivity().startService(intent);
            getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

            recordingStatusTxt.setText("Recording now...");
        } else {
            recordBtn.setImageResource(R.drawable.ic_mic_white);
            chronometer.stop();
            chronometer.setBase(SystemClock.elapsedRealtime());
            timeWhenPaused = 0;

            getActivity().stopService(intent);

            recordingStatusTxt.setText("Click the button to start recording");
        }
    }

Ответы [ 2 ]

1 голос
/ 19 января 2020

Вы не можете сохранить свой фрагмент живым. Система обрабатывает это сама. Он может убить его в любое время.

Дело в том, что после нажатия кнопки «СТАРТ» и минимизации приложения и его открытия обратно (перевод приложения в фоновый режим и обратно) счетчик и кнопка всегда возвращаются обратно к НАЧАТЬ и 00: 00.

Причина этого на самом деле довольно проста - ваш фрагмент в основном воссоздается. И это ожидаемое поведение. Чтобы продолжить, вы должны изучить Жизненный цикл действия и фрагмента

И, насколько я понимаю, это приложение Recorder, поэтому вы должны получить время от этой службы. Например, вы можете Переопределить onResume() метод вашего Фрагмента с установкой времени и статуса кнопки, используя информацию, полученную от вашего сервиса.

Удачи!

1 голос
/ 19 января 2020

Если вы минимизируете приложение во время работы, операционная система android может завершить работу вашего приложения и перезапустить его, когда пользователь вернется к нему. Вы не можете гарантировать, что это останется в памяти. Если есть какие-либо данные, которые необходимо сохранить, вы несете ответственность за их сохранение в обработчиках состояний.

Если вы хотите, чтобы какой-то процесс продолжался в фоновом режиме, вам нужно запустить Android Служба и ваш фрагмент должен будет с ней связаться. Фрагмент - это просто часть пользовательского интерфейса приложения.

...