Android - 在没有静态变量的情况下收听区域设置更改

时间:2016-07-07 07:14:40

标签: android broadcastreceiver locale

我有一个BroadcastReceiver来监听区域设置更改。这是我的问题:

我导航到Activity,然后想要通过转到设置应用更改我所做的语言环境(语言设置)。然后,BroadcastReceiver会在进行更改后在onReceive()中进行侦听。然后我导航回应用程序,当我这样做时,我想将用户带到另一个Activity

此外,语言环境修改对应于配置更改,这意味着将销毁并再次创建活动。 https://developer.android.com/guide/topics/resources/runtime-changes.html

这是BroadcastReceiver:

public class LocaleReceiver extends BroadcastReceiver {
    public LocaleReceiver() {}

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.

        if(Intent.ACTION_LOCALE_CHANGED.equals(intent.getAction())){
            MainActivity.isLocaleChanged = true;
        }
    }
}

这是使用BroadcastReceiver设置的静态变量的Activity。

public class MainActivity extends AppCompatActivity {

    public static boolean isLocaleChanged = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if(isLocaleChanged){
            Intent intent = new Intent(this,SecondActivity.class);
            startActivity(intent);
            isLocaleChanged = false;
        }
    }
}

事实上,我能够导航到另一个活动!

但是,我想以不使用静态变量的方式执行此操作(因为它们是邪恶的:()。还有其他方法可以实现此目的。

如果没有涉及SharedPreferences,我也会非常高兴。

1 个答案:

答案 0 :(得分:2)

好吧,您可以关闭区域设置的配置更改,实现onConfigurationChanged,检查更改是否属于区域设置,然后在那里启动新活动。我不确定我是否会建议它,当你用字符串返回时,你会遇到问题。在这种情况下,您必须在非静态,磁盘(sharedPreference)或通过状态单例或其他方式存储非本地状态。并不是说静态是邪恶的,它可以被滥用。这是他们有意义的情况。

我实际上建议静态优先使用共享首选项,因为如果您没有正确清除它并且搞砸了以后的应用程序执行,共享首选项可能会存在。静态不会,当您的应用程序被杀死时,它将被清除。