繁体   English   中英

Android:保持片段在后台运行

[英]Android: Keep fragment running in the background

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

单击 START 后,计数开始,按钮变为 STOP。

单击 STOP 后,计数停止,按钮变为 START。 很基本。

问题是,在单击 START 并最小化应用程序并将其打开(将应用程序置于后台并返回)后,计数和按钮始终恢复为 START 和 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");
        }
    }

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

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

你不能让你的片段保持活力。 系统自行处理。 它可以随时杀死它。

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

其背后的原因实际上非常简单 - 您的片段基本上是重新创建的。 这是预期的行为。 要继续,您应该学习Activity 和 Fragment 生命周期

据我所知,这是一个 Recorder 应用程序,因此您应该从该服务中获得时间。 例如,您可以使用从您的服务中获得的信息设置时间和按钮状态来覆盖Fragment 的onResume()方法。

祝你好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM