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

Android-在没有静态变量的情况下监听区域设置更改,android,broadcastreceiver,locale,Android,Broadcastreceiver,Locale,我有一个BroadcastReceiver,可以监听语言环境的变化。我的问题是: 我导航到一个活动,然后想通过进入设置应用程序更改语言环境(语言设置)。更改后,BroadcastReceiver会监听onReceive()。然后,我导航回该应用程序,当我这样做时,我希望将用户带到另一个活动 此外,区域设置修改对应于配置的更改,这意味着活动将被销毁并再次创建。 这是广播接收机: public class LocaleReceiver extends BroadcastReceiver {

我有一个
BroadcastReceiver
,可以监听语言环境的变化。我的问题是:

我导航到一个
活动
,然后想通过进入设置应用程序更改语言环境(语言设置)。更改后,
BroadcastReceiver
会监听
onReceive()
。然后,我导航回该应用程序,当我这样做时,我希望将用户带到另一个
活动

此外,区域设置修改对应于配置的更改,这意味着活动将被销毁并再次创建。

这是广播接收机:

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
设置的静态变量的活动

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;
        }
    }
}
事实上,我能够导航到一个不同的活动

但是,我想以一种不使用静态变量的方式来实现这一点(因为它们是邪恶的:()。还有其他方法来实现这一点吗


如果没有涉及到
共享引用
,我也会非常高兴。

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


实际上,我建议在这里使用静态而不是共享首选项,因为如果您没有正确清除共享首选项,并在以后的应用程序执行中出错,共享首选项可能会一直存在。静态不会,在最坏的情况下,当您的应用程序被终止时,它将被清除。

好吧,您可以关闭对区域设置的配置更改,实现OnConfiguration Changed,check如果更改是对区域设置的,则在那里启动新活动。但是,我不确定我是否建议这样做,当返回字符串时,您将遇到问题。在这种情况下,您必须将状态非本地存储在磁盘上的静态(SharedReference)中或者通过一个状态单例,或者其他一些方法。并不是说静态是邪恶的,而是它们可能被误用。这是一个它们有意义的例子


实际上,我建议在这里使用静态而不是共享首选项,因为如果您没有正确清除共享首选项,并在以后的应用程序执行中出错,共享首选项可能会一直存在。静态不会,在最坏的情况下,当您的应用程序被终止时,它将被清除。

我有一些问题:1.当
MainActivity.isLocaleChanged=true;
完成时,您的mainactivity在前台打开(对用户可见)?2.更改区域设置时,您只想将用户重定向到
SecondActivity
?1.不,当它(以及整个应用程序)在后台时,它就完成了。在onReceive()时,我会在设置应用程序中执行。2.是。然后你只有一个选项
SharedReference
,正如Gabe Sechan在下面的回答中所说的那样..!!我有一些问题:1.当
MainActivity.IsLocalChanged=true;
完成后,你的MainActivity是否在前台打开(用户可见)?2.当更改区域设置时,您只想将用户重定向到
SecondActivity
?1.不,当它(以及整个应用程序)处于后台时,此操作已完成。在onReceive()时,我将在设置应用程序中执行。2.是的。然后你只有一个选项
SharedReference
,正如Gabe Sechan在下面的回答中所说的那样..!!谢谢。我尝试过使用OnConfiguration Changed(),但似乎无法让它注册任何回调。我所做的是添加android:configChanges=“locale”到我想在清单中注册它的活动,并在MainActivity中包括onConfigurationChanged()。但它似乎没有注册区域设置更改。什么是“关闭区域设置的配置更改”-看起来我错过了什么。哇!实际上是android:configChanges=“layoutDirection”区域设置让onConfigChanged()正常工作。非常感谢。我也明白了为什么不建议这样做。再次感谢。为此,我尝试使用onConfigurationChanged(),但似乎无法让它注册任何回调。我所做的是添加了安卓:configChanges=“locale”到我想在清单中注册它的活动,并在MainActivity中包括onConfigurationChanged()。但它似乎没有注册区域设置更改。什么是“关闭区域设置的配置更改”-看起来我错过了什么。哇!实际上是android:configChanges=“layoutDirection”区域设置让onConfigChanged()正常工作。非常感谢。我也明白为什么不建议这样做。再次感谢。