首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从BroadcastReceiver调用Kotlin中的BroadcastReceiver函数

如何从BroadcastReceiver调用Kotlin中的BroadcastReceiver函数
EN

Stack Overflow用户
提问于 2022-10-14 01:41:47
回答 1查看 31关注 0票数 0

刚开始编程。我做了一个有效触发的BroadcastReciever。我需要它更新SharedPreferences以保存当天的用户输入(为了测试目的,它现在以较短的时间间隔设置)。我试图在接收器内创建SharedPref函数,但是接收方看不到-getSharedPreferences()。

因此,我移动了这个函数,它完成了所有的SharedPreference工作。我尝试从扩展名文件中调用它,也尝试从活动中直接调用它。在应用程序的其余部分,BroadcastReceiver似乎看不到任何功能。

清单权限和接收方“”

代码语言:javascript
复制
<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‘’

代码语言:javascript
复制
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()根本不被识别。当我将函数放在一个活动或扩展文件中时,函数名在这里是不被识别的。绕了一圈很久了。

EN

回答 1

Stack Overflow用户

发布于 2022-10-14 02:32:05

打给context.getSharedPreferences()。如果在onReceive()之外的函数中需要它,请给这些函数一个Context参数,以便将它传递给它们。onReceive中的上下文从不为null,因此您可以删除问号以简化代码(不需要检查null)。

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

例如,在您的示例中,preferenceToObjectpreferenceToObject需要上下文参数,因此需要将它们作为函数参数添加。因此,涟漪回shuffleMoods,所以这也需要一个。把这一切结合在一起:

代码语言:javascript
复制
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)
        //...
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74063484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档