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()正常工作。非常感谢。我也明白为什么不建议这样做。再次感谢。