Java Android:让片段在后台运行

Java Android:让片段在后台运行,java,android,android-fragments,Java,Android,Android Fragments,我有一个开始计数并改变图标状态的片段。打开应用程序后,会有一个count-00:00和一个显示START的按钮 单击开始后,计数开始,按钮变为停止 单击“停止”后,计数停止,按钮变为“开始”。非常基本 问题是,在单击开始并最小化应用程序并将其重新打开(将应用程序置于后台并返回)后,计数和按钮始终恢复为开始和00:00 所以问题是:在最小化应用程序后,如何保持片段的活性? 代码: 如果在运行时最小化应用程序,android操作系统可以终止应用程序,并在用户返回应用程序时重新启动。你不能保证它会留在

我有一个开始计数并改变图标状态的片段。打开应用程序后,会有一个count-00:00和一个显示START的按钮

单击开始后,计数开始,按钮变为停止

单击“停止”后,计数停止,按钮变为“开始”。非常基本

问题是,在单击开始并最小化应用程序并将其重新打开(将应用程序置于后台并返回)后,计数和按钮始终恢复为开始和00:00

所以问题是:在最小化应用程序后,如何保持片段的活性?

代码:


如果在运行时最小化应用程序,android操作系统可以终止应用程序,并在用户返回应用程序时重新启动。你不能保证它会留在记忆中。如果有任何数据需要维护,您负责将其保存在状态处理程序中


如果您希望在后台继续某些过程,您需要启动一个Android服务,并且您的片段需要与之通信。片段只是应用程序的UI部分。

您不能让片段保持活动状态。 系统自己处理它。它可以随时杀死它

问题是,在单击开始并最小化应用程序之后 将其打开(将应用程序置于后台并返回)计数和 按钮始终恢复为“开始”和“00:00”

背后的原因其实很简单——你的片段基本上是重新创建的。这是一种预期的行为。要继续,你应该学习

据我所知,这是一个录音应用程序,所以你应该得到从该服务所经过的时间。 例如,您可以使用从服务中获得的信息,通过设置时间和按钮状态来覆盖片段的
onResume()
方法


祝你好运

研究使用服务:。注意,对于秒表,您不需要;您可以保存开始时间戳并在以后的任何时间进行计算。
    @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");
        }
    }