如果我将一些用户设置和信息存储在我的Android应用程序的共享首选项中,然后我在市场中更新应用程序,这些设置会在应用程序更新时被删除吗?
我已经实现了两个activity-alias用户应该能够在运行时启用或禁用的功能.
<activity-alias
android:name=".ui.alias.open_location"
android:targetActivity=".ui.activity.location"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity-alias>
Run Code Online (Sandbox Code Playgroud)
我不希望在开始时启用它们,以免弄乱用户设备的应用程序屏幕.但在运行时,用户应该能够启用别名.我这样做是通过PackageManager:
PackageManager pm = getApplicationContext().getPackageManager();
ComponentName componentName = new ComponentName(context, ".ui.alias.open_location");
pm.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
Run Code Online (Sandbox Code Playgroud)
这在开始时就像魅力一样,但是当安装了我的应用程序的更新时,别名会再次被禁用.如何防止系统被清单覆盖启用状态?我不希望用户在开始时使用Launcher,我不希望用户在更新后重新创建所有别名快捷方式.
我想我需要类似的东西PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER,但仅限于启用状态.
谢谢!
android android-manifest android-activity android-activity-alias
我使用共享首选项来存储我的应用程序启动的次数.只有在第一次启动时,我才会显示一条欢迎消息,告诉用户该版本中的新功能和更改.
但是当我专注于重新安装应用程序或升级应用程序时,我无法删除以前的共享首选项.我想在重新安装软件或升级它时获得对话框.
AppLauncher
public class AppLauncher {
static long launch_count = 0;
private static boolean isLaunch = false;
public static void app_launched(Context mContext) {
System.out.println("I m in AppLauncher");
SharedPreferences prefs = mContext.getSharedPreferences("apprater", 0);
if (prefs.getBoolean("dontshowagain", false)) {
return;
}
SharedPreferences.Editor editor = prefs.edit();
// Increment launch counter
launch_count = prefs.getLong("launch_count", 0);
editor.putLong("launch_count", launch_count);
System.out.println("launch_count=" + launch_count);
if (launch_count == 0 || launch_count == 1) {
// showLaunchDialog(mContext);
isLaunch = true;
}
if (isLaunch == true) {
showLaunchDialog(mContext);
isLaunch = false; …Run Code Online (Sandbox Code Playgroud) 我已经在谷歌商店发布了我的应用程序,现在我想更新它.
但我想确保我的应用程序共享首选项中不会丢失存储的数据.我还在我的应用程序中设置了一些警报,它会启动通知,我也不想丢失它们.
我不确定更新应用程序的工作原理?它会改写这些东西吗?无论如何,我可以在全球发布之前对其进行测试吗?
我要指出,我在这个版本中所做的更改含有清单中有些变化:我改变targetSdkVersion和minSdkVersion(它曾经有过minSdk=8,现在我把它改成4和添加targetsdk=15),我给了一个进程名我alarmservice(这是一个intentservice到设置警报但后来决定更改它,它现在没有进程名称.
我一整天都在研究这个问题。以下是关键点:
adb install -r new.apk安装新的(更新、签名、版本代码递增)APK)8小时后
为了测试我改变SharedPrefs的文件名new.apk(SP2.xml),并在更新,从旧SharedPrefs文件old.apk(SP.xml)删除了!这是 adb shell 输出:
adb install old.apk
adb shell "su -c 'ls /data/data/com.pkg.name/shared_prefs'": CRC.xml
adb install -r new.apk
adb shell "su -c 'ls /data/data/com.pkg.name/shared_prefs'":CRC2.xml(缺少CRC.xml!)
我的 SharedPreferences 单例类 (init:) SharedPrefs.init(getApplicationContext());:
public final class SharedPrefs {
private static SharedPrefs sp;
private SharedPrefs() {
}
public static void init(Context context) {
if (sp == null) …Run Code Online (Sandbox Code Playgroud)