刚开始编程。我做了一个有效触发的BroadcastReciever。我需要它更新SharedPreferences以保存当天的用户输入(为了测试目的,它现在以较短的时间间隔设置)。我试图在接收器内创建SharedPref函数,但是接收方看不到-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>“”“
BroadcastReceiver‘’
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()根本不被识别。当我将函数放在一个活动或扩展文件中时,函数名在这里是不被识别的。绕了一圈很久了。
发布于 2022-10-14 02:32:05
打给context.getSharedPreferences()。如果在onReceive()之外的函数中需要它,请给这些函数一个Context参数,以便将它传递给它们。onReceive中的上下文从不为null,因此您可以删除问号以简化代码(不需要检查null)。
您习惯于在活动中调用的许多函数都可以在上下文中找到,因为活动本身是上下文的子类。
例如,在您的示例中,preferenceToObject和preferenceToObject需要上下文参数,因此需要将它们作为函数参数添加。因此,涟漪回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)
//...
}
}https://stackoverflow.com/questions/74063484
复制相似问题