【问题标题】:Is there any way to capture the Clear Data action programmatically in application?有没有办法在应用程序中以编程方式捕获清除数据操作?
【发布时间】:2012-05-22 10:23:24
【问题描述】:

我开发了一个 android 应用程序,它有一组活动和一个正在运行的后台服务。我将一些应用程序数据保存到设备的内存中,因此当用户从设置->应用程序->清除数据按钮单击清除数据选项时,保存在内存中的所有数据都会被清除。 当用户单击我的应用程序服务或广播接收器类中的清除数据按钮时,我必须捕获清除数据单击事件或操作(如果有),任何人都可以建议单击应用程序的清除数据时设备是否抛出任何操作所以我可以在我的应用广播接收器类中捕捉到该动作并执行所需的任务???

请用一些例子给我解决方案。

问候, 皮克斯

【问题讨论】:

    标签: android


    【解决方案1】:

    最好的方法是在应用程序首次运行或保存所有必需的详细信息时在 SharedPreferences 中存储一个值,例如“IS_DATA_CLEARED”,并始终确保在应用程序生命周期的任何时候都不会修改此值。

    SharedPreferences appSharedPrefs = PreferenceManager
                .getDefaultSharedPreferences(this);
    SharedPreferences.Editor editor = appSharedPrefs.edit();
    editor.putBoolean("IS_DATA_CLEARED",false);
    editor.apply();
    

    然后每次都做下面的检查。

    SharedPreferences sharedPreferences = PreferenceManager
                .getDefaultSharedPreferences(this);
    boolean IS_DATA_CLEARED =  appSharedPrefs.getBoolean("IS_DATA_CLEARED",true);
    
    if(IS_DATA_CLEARED){
      //DATA IS CLEARED
    }
    else{
      //DATA IS NOT CLEARED
    }
    

    【讨论】:

      【解决方案2】:

      您可以做的是在清单文件的应用程序标记中使用以下属性。

      android:manageSpaceActivity=".path.to.MyActivity"
      

      这会将设置中的“清除数据”按钮替换为“管理空间”。 现在您可以将用户重定向到由您控制的自定义活动。

      活动的启动将作为您的回调。在您的活动中处理您的数据并使用以下代码

      private void clearPreferences() {
          try {
              // clearing app data
              Runtime runtime = Runtime.getRuntime();
              runtime.exec("pm clear YOUR_APP_PACKAGE_GOES HERE");
      
          } catch (Exception e) {
              e.printStackTrace();
          }
         }
      

      清除应用数据。

      【讨论】:

      【解决方案3】:

      当用户单击我的应用程序服务或广播接收器类中的清除数据按钮时,我必须捕获清除数据单击事件或操作(如果有),任何人都可以建议设备在单击清除时抛出任何操作应用程序的数据,以便我可以在我的应用程序广播接收器类中捕获该操作并执行所需的任务???

      没有。 AFAIK,按清除数据也会停止您的进程,因此您的代码将不会运行。您会将用户按下清除数据视为与用户首次安装您的应用的情况相同。

      【讨论】:

      • 是的,我的假设也是一样的,但我在三星 Galaxy 选项卡中面临一个奇怪的问题:当任何警报来自服务器时,我的应用程序会捕获它并开始播放 wav 文件以通知用户但同时,如果用户转到应用程序的信息并单击清除数据按钮,它应该停止音轨但它没有发生,所以如果你的陈述是真的,服务也应该停止意味着 onDestroy shud 在音轨所在的服务上被调用停止但在这种情况下没有发生。为什么?
      • @piks:“它应该停止音轨”——不一定。只要它可以访问数据,它就应该继续播放。部分地,这将以缓冲区的形式出现。如果文件被另一个进程打开,也可能不会立即删除该文件,就像媒体播放的情况一样。
      • 但是我只在安装了 Android 2.2(Froyo) 的设备上遇到这个问题,比如三星 Galaxy 标签,如果我在其他版本的 android 2.1 ,2.3 及更高版本中重复这种情况,然后点击在清除数据按钮上,哔声也停止了。
      • @piks:您正在一些设备上进行测试。有数百种设备。单击“清除数据”时MediaPlayerSoundPool 等的行为未记录在案。你不应该对将会发生的事情做出任何假设。
      • 小部件的解决方案是什么?因为如果您有一个包含信息的小部件,但您清除了数据,则该信息不再有用。我们是否必须等待小部件刷新?看起来像错误...我猜小部件应该重置为清除数据...
      【解决方案4】:

      也许在你的 Manifest 中设置一个广播接收器并监听

      “android.intent.action.PACKAGE_DATA_CLEARED”

      从设置中清除应用程序数据时广播的意图。您应该能够在 android 开发者网站上找到有关此的更多信息。

      http://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_DATA_CLEARED

      【讨论】:

      • 这行不通,在此处引用 Android 文档,“请注意,已清除的包没有收到此广播。”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多