Android清除数据应用

时间:2011-02-14 15:29:14

标签: android

我正在开发一个Android应用程序。我将一些用户信息存储在共享首选项中。 我希望用户无法从设置中清除应用数据。可以吗?

Manifest中有一个权限 CLEAR_APP_USER_DATA 可以使用吗?

2 个答案:

答案 0 :(得分:5)

  

我希望用户不能从设置中清除应用数据。可以吗?

不,抱歉。用户可以随意使用手机,包括清除所有数据,卸载应用程序等。

答案 1 :(得分:0)

我还没有尝试过,我知道这是一个老问题,但你可以在谷歌服务器上备份应用数据(这里的教程:http://developer.android.com/guide/topics/data/backup.html)。

然后从技术上讲,用户仍然可以清除数据,但您可以使用警报对其进行监控。

因此,只要用户存在您的应用程序,您就可以使用上面的教程启动服务来备份用户数据,并将值保存到sharedPreferences,以表示数据备份如下:

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences();//or name your own shared pref file
SharedPreferences.Editor editor = pref.edit();
editor.putBoolean("dataIsBackedUp", true);

然后在30秒或1分钟左右发出警报,将广播发送到broadcastReceiver类以检查dataIsBackedUp的值,然后在dataIsBackedUp返回false时恢复数据。

设置闹钟:(您可以在应用程序本身和广播接收器中执行此操作)

Intent checkData = new Intent("MY_CUSTOM_INTENT_FILTER_NAME");
    PendingIntent sender = PendingIntent.getBroadcast(getApplicationContext(), 
0, checkData, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager alarmMan = (AlarmManager)getSystemService(Context.ALARM_SERVICE);

Calendar cal = Calendar.getInstance();
       cal.add(Calendar.MINUTE, 1);
alarmMan.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);

BraodcastReceiver检查数据:

public class smsReceived extends BroadcastReceiver {


    @Override
    public void onReceive(final Context context, Intent intent){

           SharedPreferences pref = PreferenceManager.getDefault();//or your own named shared prefs file
           if (pref.get("dataIsBackedUp", false)){
              Intent restoreData = new Intent(context, backupAgent.class);
              restoreData.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
               context.startService(restoreData);
            }
    }
}

在你的清单中:

<receiver android:name=".CheckData">
                    <intent-filter>
                        <action android:name="MY_CUSTOM_INTENT_FILTER_NAME"/>
                    </intent-filter>
                    <intent-filter>
                       <action android:name="android.intent.action.BOOT_COMPLETED" />
                    </intent-filter>
                </receiver>

在那里,您指定BOOT_COMPLETED,以便您也可以检查启动,然后再次开始设置警报以检查每分钟,因为警报不会在电源循环中持续存在