Java Android生命周期问题

Java Android生命周期问题,java,android,Java,Android,我正在开发一个手电筒应用程序,我想让它设置为当用户打开应用程序时,屏幕亮度达到最大。我已经设置了一个复选框首选项来执行此操作,但有一个小问题。见下面的代码: <CheckBoxPreference android:defaultValue="true" android:key="pref_brightness" android:summary="When checked, brightness will raise to highest level on ma

我正在开发一个手电筒应用程序,我想让它设置为当用户打开应用程序时,屏幕亮度达到最大。我已经设置了一个复选框首选项来执行此操作,但有一个小问题。见下面的代码:

<CheckBoxPreference
     android:defaultValue="true"
     android:key="pref_brightness"
     android:summary="When checked, brightness will raise to highest level on main activity."
     android:title="@string/pref_5" />
在这里,我访问MainActivity.java文件中的首选项。这在onCreate()方法中

现在我的问题是…当我打开应用程序时,复选框被选中(除非用户更改),亮度会像它应该的那样最大化。但是,当我进入首选项并取消选中该框,然后按下“后退”按钮时,该框将保存,但不会对主活动产生任何影响。如果我换了盒子,按下动作栏上的“向上”按钮,一切都很好。为什么按下后退按钮时它不工作?我尝试使用onBackPressed(),但似乎无法解决此问题

**根据“Karakuri”的回答更新:** 我照你说的做了,但还是不行。如果复选框未选中,我去选中它,按“上一步”按钮,它会工作,但如果我再去更改它,再按“上一步”,它不会保存。以下是您建议的代码:

感谢您的帮助


Andrew

更改属性的代码不应在
onCreate()
中。请尝试使用inside
onStart()

如果在
onCreate()
中运行此代码,则在创建活动时只会调用一次。你需要在其他地方运行它。我建议
onWindowFocusChanged()
。(您可以使用
onStart()
onResume()
,但这些不会考虑锁屏。)

解决了

我只需要一份完整的if声明,如下所示:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
    boolean box = getPrefs.getBoolean("pref_brightness", true);     
    if (box == true) {
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.screenBrightness = 100 / 100.0f;
        getWindow().setAttributes(lp);
    }
    else{
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.screenBrightness = -1;
        getWindow().setAttributes(lp);
    }
    super.onWindowFocusChanged(hasFocus);
}
现在,如果选中此复选框,则将主活动的亮度更改为“满”,但如果未选中此复选框,则将用户的亮度设置为其设置

感谢卡拉库里和尼扎姆的帮助


Andrew

在哪个生命周期回调中设置窗口属性?@Karakuri--onCreate()中。您可能需要将其设置回原始值。现在所发生的是你勾选这个框,它运行代码以最大化亮度。然后取消选中该框,它将再次运行代码,但由于未选中该框,因此不会执行任何操作。因此,该窗口上的亮度永远不会重置。你认为我也需要一个else段吗?我如何将其设置回默认值?好吧,我想你必须保存用户以前的亮度设置,并在未选中该框时使用该值。我不知道如何得到这个值,但是…解决了!感谢您的帮助。(StackOverflow没有私有消息功能,否则我会更喜欢…)嗨,Andrew,正如您所指出的,我给了您适当的生命周期回调,并且在评论中建议,如果未选中该框,则有必要重置该值。虽然这方面的细节很有趣,但我不认为你有理由选择自己发布答案。如果你能为我的回答还清信用,我将不胜感激……我指的是声誉积分。选择自己的答案意味着其他人不会因为帮助别人而获得声誉。对不起,如果不清楚的话。啊,我明白了。修正了:)
@Override
public void onWindowFocusChanged(boolean hasFocus) {
SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
boolean box = getPrefs.getBoolean("pref_brightness", true);     
    if (box == true) {
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.screenBrightness = 100 / 100.0f;
        getWindow().setAttributes(lp);
    }
    super.onWindowFocusChanged(hasFocus);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
    SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
    boolean box = getPrefs.getBoolean("pref_brightness", true);     
    if (box == true) {
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.screenBrightness = 100 / 100.0f;
        getWindow().setAttributes(lp);
    }
    else{
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.screenBrightness = -1;
        getWindow().setAttributes(lp);
    }
    super.onWindowFocusChanged(hasFocus);
}