【问题标题】:how to clear my SharedPreferences when my app is killed through task manager?当我的应用程序通过任务管理器被杀死时,如何清除我的 SharedPreferences?
【发布时间】:2013-09-28 08:11:38
【问题描述】:

我正在使用 SharedPreferences 将我的 CheckBox 项目的状态保存在我的 ListView 中,这样当我从 FragmentActivity A 切换到 FragmentActivity B 再切换回 FragmentActivity A 时,我不会丢失选中状态。我想清除我的 SharedPreferences 如果用户退出应用。

我的 SharedPreferences 在我的 BaseAdapter 类中初始化,如下所示:

private SharedPreferences sharedPreferences;
public static SharedPreferences.Editor editor;

我在 FragmentActivity A 中覆盖 onBackPressed() 方法并调用

MyBaseAdapter.editor.clear().commit();

如果用户通过单击后退按钮退出应用程序,我只能清除我的 SharedPreferences,但如果用户在应用程序运行时通过任务管理器终止应用程序,SharedPreferences 不会被清除。因此,当用户再次打开应用程序时,我的 ListView 中的 CheckBox 项目会被选中,这不应该被选中。当用户打开应用程序时,我的 ListView 中的 CheckBox 项目应该被取消选中。问题是如果我的应用在应用处于活动或运行状态时被用户通过任务管理器杀死,我该如何清除我的 SharedPreferences?

我尝试在 FragmentActivity A 上覆盖 onStop() 方法并调用

MyBaseAdapter.editor.clear().commit();

但是当我从 FragmentActivity A 导航到 FragmentActivity B 时,我的 SharedPreferences 被删除。当我在 FragmentActivity A 到 FragmentActivity B 之间切换时,我不想丢失我的 ListView 中的 CheckBox 项的状态,反之亦然。

【问题讨论】:

  • 如果您不希望这些值被持久化,为什么要使用 SharedPreferences?如果您的应用程序被杀死,您将无法清除它们。
  • 我的问题是成立的。如果您不想保存这些值,为什么要使用 SharedPreferences?
  • 作为@Simon 评论的补充,如果您需要仅在会话期间保留一些值,那么您可以将它们存储在例如一些静态变量中。或者,您仍然可以使用 SharedPreferences,但每次应用程序启动时,清除 SharedPreferences。
  • 好的,你还没有回答我的问题是“为什么”,而不是“为什么”。我猜你不想将任何值从你的应用程序的一个实例保存到另一个实例。 portabledroid.wordpress.com/2012/05/04/singletons-in-android 这可能是最简单的。就个人而言,我会使用片段之间共享的复选框列表或布尔值的并行数组来保留它们的检查状态,尽管这更难管理。
  • @Marss 看看我的回答

标签: android android-layout android-fragments android-activity


【解决方案1】:

如果您想在应用启动时清除共享偏好,为什么要使用它们?

共享首选项是一种存储小首选项并稍后阅读它们的方式,用于设置等内容。

您可以在您的活动中定义静态变量并在您的其他活动中读取它们。如果您确实想清除共享首选项,您应该在应用程序启动后执行此操作被杀。 静态变量示例:

public static int i;
if(I want to set a value){
i = 1;
}

要在另一个活动中访问它:

if(MainActivity.i == 1){
//do something
}

【讨论】:

  • 它正在工作。我在我的 FragmentActivity 类中初始化了 SharedPreferences,而不是从我的 BaseAdapter 类中初始化它,并将它声明为公共静态 SharedPreferences 以便我可以从我的 BaseAdapter 类中使用它。我还在我的 onCreate 方法中添加了一个条件 if(Bundle==null),然后清除我的 SharedPreferences,以便在用户打开应用程序时删除我的 SharedPreferences。
  • @Marss 太棒了。我很高兴能帮上忙 :)
  • 我也将我的数据存储在一个变量中,但存在一个问题,即当 Android 静默杀死应用程序以回收一些内存时,我该如何重新获取我的数据,因为如果我使用的是共享偏好然后我的问题会得到解决的。
【解决方案2】:

在应用启动时清除它们。和我一样。

【讨论】:

  • 如果我调用 MyBaseAdapter.editor.clear().commit(); 我会收到此错误在我的 onCreate() 方法 09-28 19:24:32.641: E/AndroidRuntime(6409): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.usjr.sss/com.usjr.sss.activity.CourseFragmentActivity} : java.lang.NullPointerException
【解决方案3】:

我不知道您是如何将值设置为 SharedPreferences 或为什么将其声明为静态的,因为它已经被称为 Shared 并且是这样的,但我通常设置值是这样的:

Integer myValue=0;//some int value
SharedPreferences sp = getApplicationContext().getSharedPreferences("SomeFileName", Context.MODE_PRIVATE);
    Editor ed = sp.edit();
    ed.putInt("myKey", myValue);
    ed.commit();

然后再读一遍:

SharedPreferences sp = getApplicationContext().getSharedPreferences("SomeFileName", Context.MODE_PRIVATE);
            Integer myValue= sp.getString("myKey", null);

简单地清除文件“SomeFileName”中的值:

SharedPreferences sp = getApplicationContext().getSharedPreferences("SomeFileName", Context.MODE_PRIVATE);
            Editor ed = sp.edit();
            ed.clear().commit();

所以请确保在onCreate() 中以正确的方式清除SharedPreferences 文件,我想它会起作用。

【讨论】:

  • 我明白了。谢谢。我将它声明为静态,以便我可以通过其他类访问它。
  • 请注意,当您在SharedPreferences 中设置值时,您可以从任何其他活动中访问它,而无需将其声明为静态
【解决方案4】:

当我的应用通过task manager 杀死时,您无法清除SharedPreferences

【讨论】:

    【解决方案5】:

    您无法以编程方式清除共享首选项内容 - 您可以从应用程序管理器中清除您的应用程序数据,这是推荐的方式。

    【讨论】:

      【解决方案6】:

      如果 SharedPreferences 数据位于不同的应用程序中...我不知道您如何访问它。 首先您可以使用 SQL 解决您的问题,然后您可以在任何活动中毫无问题地访问您的数据库。

      其次,如果您不想在程序运行时杀死变量,但在程序退出时杀死它们,那么只要不完成您不会丢失变量的活动。

      您还可以制作类似于 SingleTone 的活动 SingleInstance

      如果你必须这样做,那就是你想要的工作方式......创建一个 SQL 列表并在主屏幕的 onDestroy() 上清除它

      但我建议您阅读有关共享首选项以及何时使用它们的信息...因为似乎没有任何需要...

      【讨论】:

      • 我没有其他应用程序。我的 SharedPreferences 在我的 BaseAdapter 类中初始化,如下所示: private SharedPreferences sharedPreferences;公共静态 SharedPreferences.Editor 编辑器;然后我在 FragmentActivity 类中覆盖 onBackPressed() 方法并调用 MyBaseAdapter.editor.clear().commit();如果用户通过单击后退按钮退出应用程序,我只能清除我的 SharedPreferences,但如果用户在应用程序运行时通过任务管理器终止应用程序,则不会清除 SharedPreferences。因此,当用户再次打开应用程序时,我的 ListView 中的 CheckBox 项目会被选中。
      • 抱歉打字太快了... app = activity:)
      • 在这种情况下,您是否尝试覆盖 onDestroy?
      • 我做到了。如果用户在应用运行时通过任务管理器杀死应用,则不会调用 onDestroy() 方法。
      【解决方案7】:

      只需清除 onDestroy 和 onStop 方法中的值

      override fun onStop() {
          //clear data here before super
          super.onStop()
      }
      
      override fun onDestroy() {
          //clear data here before super
          super.onDestroy()
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-17
        • 1970-01-01
        • 2011-02-16
        • 2016-12-12
        • 1970-01-01
        • 2011-09-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多