所以在我的应用程序中,我使用SharedPreferences
来保存片段状态。但是,一旦用户走出应用程序,我想删除SharedPreferences
中的条目。我尝试了以下方法:
在我的主要课程中:
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
if(isFinishing() == true)
{
SM.removePreferences();
}
}
其中SM是我创建的辅助类的实例。 removerPreferences执行以下操作:
public void removePreferences(){
editor.clear();
editor.commit();
}
但我发现这从未执行过。通过日志,我确实看到应用程序进入了isFinishing()if语句,但该方法永远不会执行。我也尝试了onDestroy()
,但这种方法从未被调用过。
有人可以帮我吗?
答案 0 :(得分:1)
使用onstop覆盖来执行此操作
像这样:@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
if(isFinishing() == true)
{
SM.removePreferences();
}
}
答案 1 :(得分:0)
我认为您正在寻找的东西可以使用onSaveInstanceState
机制来实现。
尽管如此,我会尝试回答您的具体问题,同时假设通过说“方法永远不会实现”,您的意思是if语句值始终为false,并且您的方法不会被调用。
isFinishing()
仅在您true
上致电finish()
或其他人要求完成时才会返回Activity
。
如果您只是单击主页按钮,您将获得isFinishing()
== false
,因此您的方法不会被调用。因此,请确保您实际上正在完成Activity
,而不仅仅是暂停它。
无论如何,找出问题的最佳方法是使用调试器。
答案 2 :(得分:0)
不要在SharedPreferences
中保存Fragment的实例状态,而是在Bundle中保存。您可以像这样访问它:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if ((savedInstanceState != null) {
// get your values, for example:
mID = savedInstanceState.getInt("ID");
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// put your values, for example:
outState.putInt("ID", mID);
}
这样您就不必自己管理这些值。
如果您有自定义对象,则可以让它们实现Parcelable
。
相比之下,SharedPreferences
旨在保存即使在申请结束后仍应存在的值,即:偏好。
答案 3 :(得分:0)
更好的位置是没有if语句的onDestroy() 但是,您可以从Android文档中读取有关onDestroy()的信息:
在某些情况下,系统会在不调用此方法(或其他任何方法)的情况下简单地终止活动的托管过程,因此不应该使用它来执行过程消失后要保留的内容。
所以,在我看来,如果你不希望在活动结束后数据仍然存在,你应该使用一个类来保存它。