我正在开发一个Android应用程序。我将一些用户信息存储在共享首选项中。 我希望用户无法从设置中清除应用数据。可以吗?
Manifest中有一个权限 CLEAR_APP_USER_DATA 可以使用吗?
答案 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,以便您也可以检查启动,然后再次开始设置警报以检查每分钟,因为警报不会在电源循环中持续存在