Android 静态SharedPref在广播接收器中提供未初始化的值
我保留了一个静态共享首选项来访问多个活动的值 现在,我设置了一个闹钟在某个特定的时间响。现在在广播接收器中,我尝试访问共享pref变量 它已经在另一个活动中初始化,并在那里返回正确的值 但是在这个广播接收器中,它没有给出实际值。它给出了未初始化的值 既然它是静态的,那么值不应该保持不变吗 这是共享首选项类Android 静态SharedPref在广播接收器中提供未初始化的值,android,broadcastreceiver,sharedpreferences,Android,Broadcastreceiver,Sharedpreferences,我保留了一个静态共享首选项来访问多个活动的值 现在,我设置了一个闹钟在某个特定的时间响。现在在广播接收器中,我尝试访问共享pref变量 它已经在另一个活动中初始化,并在那里返回正确的值 但是在这个广播接收器中,它没有给出实际值。它给出了未初始化的值 既然它是静态的,那么值不应该保持不变吗 这是共享首选项类 package com.footballalarm.invincibles; import android.content.Context; import android.content.
package com.footballalarm.invincibles;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;
public class SessionManagement {
// Shared Preferences
public static SharedPreferences pref;
// Editor for Shared preferences
public static Editor editor;
// Context
Context _context;
// Shared pref mode
int PRIVATE_MODE = 0;
// Shared pref file name
private static final String PREF_NAME = "invincibles_alarm";
// All Shared Preferences Key
public static final String PREF_MATCH = "match";
// Constructor
public SessionManagement(Context context){
this._context = context;
pref = _context.getSharedPreferences(getPrefName(), PRIVATE_MODE);
editor = pref.edit();
editor.commit();
Log.e("Pref Match Value-constructor for pref", getValueMatch());
}
public static void fillValues(String match){
try{// Storing login value as TRUE
editor.putString(PREF_MATCH, match);
// commit changes
editor.commit();
Log.e("Pref Match Value-in fill values", getValueMatch());
}
catch(Exception e)
{Log.e("fillValues", e.toString());}
}
public static String getValueMatch(){
return pref.getString(PREF_MATCH, "Loading Match");
}
public static String getPrefName() {
return PREF_NAME;
}
}
我尝试将输出记录到其他活动中,它会正确返回
当我运行应用程序,然后在警报发生前将其关闭时,由于广播接收器无法访问共享pref,程序崩溃,出现空指针异常
我已经尝试过这个解决方案,但我只是在清单中为接收者使用名称
仅当我通过最小化菜单关闭ICS中的应用程序时才会发生这种情况。检查此链接:
在您的情况下,可能静态变量正在失去其值
在下列情况下,静态变量可能会丢失值:
1) 类被卸载
2) JVM关闭
3) 这个过程结束了
与其使用静态变量和函数,不如尝试使用公共类
希望能有帮助
编辑1:
PreferenceForApp myPref = new PreferenceForApp(contxt);
myPref.getIsDeviceValidated();
使用公共类作为首选项而不是静态方法的示例代码
public class PreferenceForApp {
Context context;
SharedPreferences prefs;
public PreferenceForApp(Context context) {
this.context = context;
prefs = context.getSharedPreferences(AllConstants.PREFS_NAME, 0);
}
public Boolean getIsDeviceValidated() {
return prefs.getBoolean("Validated", false);
}
public void setIsDeviceValidated(Boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("Validated", value);
editor.commit();
}
}
在代码中添加:
PreferenceForApp myPref = new PreferenceForApp(contxt);
myPref.getIsDeviceValidated();
有用的相关链接:
PreferenceForApp myPref = new PreferenceForApp(contxt);
myPref.getIsDeviceValidated();
编辑2
测试静态变量松动值是什么时候:
您可以使用几行代码来测试这一点:
- 在创建活动时打印未初始化的静态->应打印空
- 初始化静态文件。打印它->值将不为空
- 点击后退按钮,进入主屏幕。注意:主屏幕是另一项活动
- 再次启动活动->静态变量将不为空
- 从DDMS终止应用程序进程(设备窗口中的停止按钮)
- 重新启动活动->静态值将为空
在我的例子中,我引用了这个链接,它发生在我手动关闭应用程序时@Rachita有没有办法保持它的持久性?我认为静态变量由于上述原因之一正在失去值。正如我所建议的,您应该为首选项和公共方法使用公共类