我想从后台服务的另一个函数中调用一个函数以显示一条消息。问题是我正在检查布尔值,当我打开应用程序时,它会初始化为 false 再次,以便它再次运行该功能(我只想要一次)。
代码如下:
OnCreate:
public void onCreate() {
handler = new Handler();
runnable = new Runnable() {
public void run() {
milestoneCheck();// THE FIRST FUNCTION
handler.postDelayed(runnable, 10000);
}
};
handler.postDelayed(runnable, 15000);
}
第一个功能
public void milestoneCheck() {
totalKm =(int) Float.parseFloat(TripsInfo.km.get(TripsInfo.userRank - 1));
SharedPreferences sharedPreferencesInac = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
isSeen =sharedPreferencesInac.getBoolean("inactive", false);
if (totalKm ==84 && !isSeen) {
milestoneNotification(totalKm);
isSeen = true;
} else if (totalKm == 130 && isSeen) {
milestoneNotification(totalKm);
isSeen = false;
} else if (totalKm == 200 && !isSeen) {
milestoneNotification(totalKm);
}
}
在我的主要活动中,我也有这样的共享首选项
SharedPreferences sharedPreferencesIn = getSharedPreferences("inactivity", Context.MODE_PRIVATE);
SharedPreferences.Editor editorIn = sharedPreferencesIn.edit();
editorIn.putBoolean("inactive", false);
editorIn.apply();
SharedPreferences sharedPreferencesInac = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
isSeen =sharedPreferencesInac.getBoolean("inactive", false);
最后isSeen
是我的mainactivity中的一个公共静态变量!
所以问题是,在开始时isSeen为false,然后为true,但是如果我重新打开,则应用程序又为false。
更新
private void updateTrue() {
SharedPreferences sharedPreferencesIn = getSharedPreferences("inactivity", Context.MODE_PRIVATE);
SharedPreferences.Editor editorIn = sharedPreferencesIn.edit();
editorIn.putBoolean("inactive", true);
editorIn.apply();
SharedPreferences sharedPreferencesInac = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
isSeen =sharedPreferencesInac.getBoolean("inactive", true);
}
UPDATE V2
我更改了功能并将其放在Asynctask上,但仍然遇到相同的问题
protected String doInBackground(String... aurl) {
totalKm =(int) Float.parseFloat(TripsInfo.km.get(TripsInfo.userRank - 1));
Log.d("test","before"+isSeen);
if (totalKm ==84 && !isSeen ) {
milestoneNotification(totalKm);
updateTrue(true);
} else if (totalKm == 130 && isSeen) {
milestoneNotification(totalKm);
} else if (totalKm == 200 ) {
milestoneNotification(totalKm);
}
test=getSharedPreferences("inactivity",0);
isSeen=test.getBoolean("inactive",false);
Log.d("test","after"+isSeen);
return null;
}
private void updateTrue(boolean value) {
SharedPreferences sharedPreferencesIn = getSharedPreferences("inactivity",Context.MODE_PRIVATE);
SharedPreferences.Editor editorIn = sharedPreferencesIn.edit();
editorIn.putBoolean("inactive", value);
editorIn.apply();
test=getSharedPreferences("inactivity",0);
isSeen=test.getBoolean("inactive",false);
Log.d("test","function"+isSeen);
}
updateTrue()
在AsyncTask上不是
答案 0 :(得分:0)
您将inactive
设置为false
SharedPreferences.Editor editorIn = sharedPreferencesIn.edit();
editorIn.putBoolean("inactive", false);
editorIn.apply();
如果您以后希望它为true,请将其设置为true
editorIn.putBoolean("inactive", true);
答案 1 :(得分:0)
将isSeen
变量设置为true
不会更改保存在boolean
中的SharedPreferences
值。您必须自己做。
以下if statement
if (totalKm ==84 && !isSeen) {
milestoneNotification(totalKm);
isSeen = true;
}
替换
isSeen = true;
调用一个函数,该函数会将boolean
中的true
值更新为SharedPreferences
更新SharedPreferences的方法
public void updateSharedPreferences(boolean value) {
SharedPreferences sharedPreferencesIn =
getSharedPreferences("inactivity", Context.MODE_PRIVATE);
SharedPreferences.Editor editorIn = sharedPreferencesIn.edit();
editorIn.putBoolean("inactive", value);
editorIn.apply();
}
现在,当您想将boolean
中的true
值设置为SharedPreferences
时,只需调用该方法并传递true
作为参数即可。
updateSharedPreferences(true);
类似地,您可以再次将其设置为false,只需将false
作为参数传递
updateSharedPreferences(false);
读取保存在SharedPreferences
中的值的方法
public boolean readFromSharedPrefs() {
SharedPreferences sharedPreferencesIn =
getSharedPreferences("inactivity", Context.MODE_PRIVATE);
return sharedPreferencesIn.getBoolean("inactive", false);
}
在任何要检索保存在SharedPreferences
中的值的地方调用此方法
boolean isSeen = readFromSharedPrefs();