使用警报编辑 SharedPreferences

Edit SharedPreferences with an Alarm

我是 Android 开发的新手,我试图在每天的特定时间更新一个值,以便当用户打开应用程序时,该值是当天的最新值。 我这样做的方法是调用一个警报,该警报在我的 mainactivity.java 中执行一个方法,该方法编辑 sharedPreferences 中的一个值。代码示例:

------------------------MainActivity.java---------------- ------------

 protected void onCreate(Bundle savedInstanceState) {
 [...]
 int myVar=0;
 //Retrieving my saved data
     int sPSavedData=getPreferences(Context.MODE_PRIVATE).getInt("DATA", 0);
     if(sPSavedData!=(0))
       {
        myVar=sPSavedData;
       }
  [...]
    }
//doing my thing
public void myCode(){
myVar=+1;
saveSP();
}
//saving data in Shared Preferences
public void saveSP(){
SharedPreferences.Editor sPEditor=getPreferences(Context.MODE_PRIVATE).edit(); //<---I get an error here
sPEditor.putInt("DATA", myVar);
sPEditor.commit();
}
[...]

然后我的 Alarm.java 文件有接收者:

[...]
public void onReceive(Context context, Intent intent)
    {
        MainActivity code=new MainActivity();
        code.myCode();
     }
[...]

我在尝试执行此操作时遇到错误

sPEditor=getPreferences(Context.MODE_PRIVATE).edit() 

并理解 logcat 我知道这与无法检索包名称有关。

是否有任何方法可以修复我的错误或任何其他方法来做我想做的事情?

试试这个....

SharedPreferences sPEditor = getSharedPreferences("yourfilename", 0);     
SharedPreferences.Editor sPEditor = sPEditor.edit();    

它应该可以解决您的问题

Context 仅在打开应用程序时创建,而不是在实例化 application/activity 的 class 时创建。如果您想访问应用程序的上下文,您需要使用 BroadcastReceiver 并按照此处的示例 Using alarmmanager and broadcastreceiver in android 安排定期警报。

像这样调整你的代码:

saveData()

public void saveData(Context context, int data){
    SharedPreferences sharedPref = getDefaultSharedPreferences(context);
    SharedPreferences.Editor spEditor = sharedPref.edit();
    spEditor.putInt("DATA", data);
    spEditor.commit();
}

getData()

public int getData(Context context){
    SharedPreferences sharedPref = getDefaultSharedPreferences(context);
    int sPSavedData= sharedPref.getInt("DATA", 0);
    return sPSavedData;
}

myCode()

public void myCode(Context context){
    int sPSavedData = getData(context);
    if(sPSavedData != 0){
        saveData(context, sPSavedData++);
    }
}

onReceive()

public void onReceive(Context context, Intent intent){
    MainActivity code=new MainActivity();
    code.myCode(context);
}