Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 静态SharedPref在广播接收器中提供未初始化的值_Android_Broadcastreceiver_Sharedpreferences - Fatal编程技术网

Android 静态SharedPref在广播接收器中提供未初始化的值

Android 静态SharedPref在广播接收器中提供未初始化的值,android,broadcastreceiver,sharedpreferences,Android,Broadcastreceiver,Sharedpreferences,我保留了一个静态共享首选项来访问多个活动的值 现在,我设置了一个闹钟在某个特定的时间响。现在在广播接收器中,我尝试访问共享pref变量 它已经在另一个活动中初始化,并在那里返回正确的值 但是在这个广播接收器中,它没有给出实际值。它给出了未初始化的值 既然它是静态的,那么值不应该保持不变吗 这是共享首选项类 package com.footballalarm.invincibles; import android.content.Context; import android.content.

我保留了一个静态共享首选项来访问多个活动的值

现在,我设置了一个闹钟在某个特定的时间响。现在在广播接收器中,我尝试访问共享pref变量

它已经在另一个活动中初始化,并在那里返回正确的值

但是在这个广播接收器中,它没有给出实际值。它给出了未初始化的值

既然它是静态的,那么值不应该保持不变吗

这是共享首选项类

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有没有办法保持它的持久性?我认为静态变量由于上述原因之一正在失去值。正如我所建议的,您应该为首选项和公共方法使用公共类