我有一个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
,我也会非常高兴。
答案 0 :(得分:2)
好吧,您可以关闭区域设置的配置更改,实现onConfigurationChanged,检查更改是否属于区域设置,然后在那里启动新活动。我不确定我是否会建议它,当你用字符串返回时,你会遇到问题。在这种情况下,您必须在非静态,磁盘(sharedPreference)或通过状态单例或其他方式存储非本地状态。并不是说静态是邪恶的,它可以被滥用。这是他们有意义的情况。
我实际上建议静态优先使用共享首选项,因为如果您没有正确清除它并且搞砸了以后的应用程序执行,共享首选项可能会存在。静态不会,当您的应用程序被杀死时,它将被清除。