防止 DialogFragment 将应用程序发送到节能模式

Prevent DialogFragment from sending the app into energy save mode

我正在为 Android 可穿戴设备创建一个应用程序。

将自定义布局显示为对话片段时,应用程序将在大约 30 秒后最小化(被表盘取代)。我知道这应该是应用程序与用户脱节的默认行为,但就我而言,应用程序需要保持可见,即使四分钟没有被触摸。

调用它的 Activity 确实在其 onCreate 实现中获得了这些指令。

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

这就像一个魅力,以我想要的方式工作。但是,用作错误通知的 DialogFragment(可能需要在一段时间内不接触它才能被观察到)不遵守此设置。

我也试图通过将其放置在 onViewCreated 调用中来获取 DialogFragment 中的标志,但它没有 getWindow 方法。虽然下一个代码段有效,但它也不起作用。

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

对话片段的调用方式如下所示。这是从需要显示它的 FragmentActivity 中调用它的代码。您可能会注意到,有一个字段 "activity",这是因为整个调用是从 activity 之外的静态 class 完成的。我想从多个活动中调用同一个 DialogFragment,只是文本和标题不同。

   public static void showDialogCuston(String title, String message, FragmentActivity activity){

        ErrorDialogFragment edf = ErrorDialogFragment.newInstance(title,message);

        FragmentManager fm = activity.getSupportFragmentManager();
        edf.show(fm, "TAG");
    }

这就是 DialogFragment 内部的样子。我踢掉了所有 TextView 文本分配,因为我怀疑它们能否提供有关该请求的任何类型的信息,并且只会降低代码片段的可读性。

public class ErrorDialogFragment extends DialogFragment {

    //some private text views
    public ErrorDialogFragment(){

    }

    public static ErrorDialogFragment newInstance(String title, String text){
        ErrorDialogFragment edf = new ErrorDialogFragment();
        Bundle args = new Bundle();
        args.putString("title",title);
        args.putString("text",text);
        edf.setArguments(args);
        return edf;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_error, container, false);
        // R.layout.fragment_error is the layout that serves as my custom dialog
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        //assigning layout elements to private fields
        //assigning stuff from the bundle inside some textViews

        closeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
                //playing a sound from SoundPool and doing haptic feedback on button press
            }
        });
    }
}

所以,我想要的是,当一个人盯着 DialogFragment 太久而没有触摸它时,应用程序不会自行消失。

对于您的情况,我建议在对话框布局文件中保留屏幕打开标志,以便在对话框视图可见时,它会保持屏幕打开。查看 developer's documentation 了解更多信息。但是,为了方便起见,我添加了文档中的代码。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true">
    ...
</RelativeLayout>

在对话框布局的根元素中将 android:keepScreenOn 设置为 true。我希望您的 AndroidManifest.xml 文件中也有以下权限。

<uses-permission android:name="android.permission.WAKE_LOCK" />