如何从Kotlin的BroadcastReceiver调用SharedPreference函数


编程新手。我做了一个BroadcastReciver,它能有效地触发。我需要它更新SharedPreferences以保存当天的用户输入(出于测试目的,它现在以较短的间隔设置(。我试图在Receiver中创建SharedPref函数,但Receiver看不到-getSharedPreferences((。

所以我移动了做所有SharedPreference工作的函数。我尝试过从扩展文件调用它,也尝试过直接从"活动"调用它。BroadcastReceiver似乎在应用程序的其余部分看不到任何功能。

清单权限和接收者''

<uses-permission android:name="android.permission.USE_EXACT_ALARM" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_FORGROUND_SERVICE" />
...
<receiver
android:name=".SaveReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

''

广播接收器''

class SaveReceiver : BroadcastReceiver() {


override fun onReceive(context: Context?, intent: Intent?) {
Log.d(
"SaveAlarmLog",
"Save Receiver Broadcast Recieved"
)
shuffleMoods()
}
fun shuffleMoods() {
myApp.sixDaysAgoMood = preferenceToObject(myApp.SIX_DAYS_AGO_MOOD)
objectToPreference(myApp.sixDaysAgoMood, myApp.SEVEN_DAYS_AGO_MOOD)
myApp.fiveDaysAgoMood = preferenceToObject(myApp.FIVE_DAYS_AGO_MOOD)
objectToPreference(myApp.fiveDaysAgoMood, myApp.SIX_DAYS_AGO_MOOD)
myApp.fourDaysAgoMood = preferenceToObject(myApp.FOUR_DAYS_AGO_MOOD)
objectToPreference(myApp.fourDaysAgoMood, myApp.FIVE_DAYS_AGO_MOOD)
myApp.threeDaysAgoMood = preferenceToObject(myApp.THREE_DAYS_AGO_MOOD)
objectToPreference(myApp.threeDaysAgoMood, myApp.FOUR_DAYS_AGO_MOOD)
myApp.twoDaysAgoMood = preferenceToObject(myApp.TWO_DAYS_AGO_MOOD)
objectToPreference(myApp.twoDaysAgoMood, myApp.THREE_DAYS_AGO_MOOD)
myApp.yesterdayMood = preferenceToObject(myApp.YESTERDAY_MOOD)
objectToPreference(myApp.yesterdayMood, myApp.THREE_DAYS_AGO_MOOD)
currentMood = preferenceToObject(myApp.CURRENT_MOOD)
objectToPreference(currentMood, myApp.YESTERDAY_MOOD)
}
fun preferenceToObject(MOOD_DAY_PREFERENCE: String): Mood {
myApp.moodSharedPref = getSharedPreferences(FILE_NAME, AppCompatActivity.MODE_PRIVATE)
val moodJsonString = myApp.moodSharedPref.getString(MOOD_DAY_PREFERENCE, null)
myApp.dayMoodObject = Gson().fromJson<Mood>(moodJsonString, Mood::class.java)
return myApp.dayMoodObject
}
fun objectToPreference(mood: Mood, PREFERENCE_NAME: String) {
myApp.moodSharedPref = getSharedPreferences(FILE_NAME, MODE_PRIVATE)
val moodSharedPrefEditor = myApp.moodSharedPref.edit()
val moodJsonString = Gson().toJson(mood)
moodSharedPrefEditor.putString(PREFERENCE_NAME, moodJsonString).apply()
}
}

"在上面的代码中,我把所有的函数都放在接收器中,只是为了显示我想要做的事情。我知道放在那里太多了。在这种格式中,getSharedPreferences((根本无法识别。当我把函数放在"活动"或"扩展"文件中时,这里无法识别函数名称。我兜圈子已经有一段时间了。

调用context.getSharedPreferences()。如果在onReceive()之外的函数中需要它,请为这些函数指定一个Context参数,以便将它传递给它们。onReceive中的Context从不为null,因此您可以删除问号以使代码更简单(不必检查null(。

您习惯于在活动中调用的许多函数都可以在上下文中找到,因为活动本身是上下文的子类。

例如,在您的案例中,preferenceToObjectpreferenceToObject需要Context参数,因此您需要将它们添加为函数参数。因此,这会波及到shuffleMoods,因此也需要一个。综合起来:

class SaveReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
//...
shuffleMoods(context)
}
fun shuffleMoods(context: Context) {
myApp.sixDaysAgoMood = preferenceToObject(context, myApp.SIX_DAYS_AGO_MOOD)
objectToPreference(context, myApp.sixDaysAgoMood, myApp.SEVEN_DAYS_AGO_MOOD)
//...
}
fun preferenceToObject(context: Context, MOOD_DAY_PREFERENCE: String): Mood {
myApp.moodSharedPref = context.getSharedPreferences(FILE_NAME, AppCompatActivity.MODE_PRIVATE)
//...
}
fun objectToPreference(context: Context, mood: Mood, PREFERENCE_NAME: String) {
myApp.moodSharedPref = context.getSharedPreferences(FILE_NAME, MODE_PRIVATE)
//...
}
}

相关内容

  • 没有找到相关文章

最新更新