kotlin 应用程序关闭时在前台服务中维护状态

h9a6wy2h  于 2023-10-23  发布在  Kotlin
关注(0)|答案(1)|浏览(157)

我正在做一个与BLE设备交互的项目。当应用程序打开时,我会主动显示从设备传输的数据。但是,我希望能够接收数据时,应用程序被关闭以及。现在,我有一个前台服务正在运行,在应用程序关闭后继续从BLE设备接收数据。我想持久化此数据并在应用恢复时更新状态。
现在,我有一个ViewModel来处理片段的UI。我最初的计划是当我的MainActivity被销毁时,通过bundle将所有数据传递给我的Service。然后,每当我从BLE设备接收数据时,我都会将新状态存储在共享首选项中。当MainActivity恢复时,我检查sharedPreferences以检索Service中更新的状态,然后从那里继续。
但是,我不确定这是否是最好的方法,因为我在ViewModel中存储了相当多的数据(2个类,1个BLE设备列表和1个BLE服务列表)。我想知道是否有更好的方法来维护这样的状态,例如ViewModel,但更像服务器。

ltskdhd1

ltskdhd11#

看看.我已经创建了一个前台服务,并在API 34上测试了这段代码。
不需要使用Bundles或Binders。
我删除了不相关的线。正如你所看到的,我可以通过简单地调用方法将数据从MainActivity传输到FGService,反之亦然。
通常,服务和Activity一次只运行一次。所以使用singleton就可以了。如果您计划同时多次运行Activity,则必须更新代码。
要持久化数据,我建议使用SQLite,因为它不仅比共享首选项快。
MainActivity.kt:

package com.example.myapplication

import android.content.Intent
import android.util.Log
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    companion object {
        var sngltn: MainActivity? = null
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        sngltn = this
        startForegroundService(Intent(this, FGService::class.java))
    }

    fun fromFGService(data: Int) {
        Log.e("moh", "MainActivity received some data from FGService: $data")
    }

    override fun onDestroy() {
        super.onDestroy()
        if (FGService.sngltn != null)
            FGService.sngltn!!.fromMainActivity(123)
        sngltn = null
    }
}

FGService.kt:

package com.example.myapplication

import android.app.Service
import android.os.Looper
import android.util.Log

class FGService : Service() {

    companion object {
        var sngltn: FGService? = null
    }

    override fun onCreate() {
        super.onCreate()
        sngltn = this
        if (MainActivity.sngltn != null) MainActivity.sngltn!!.fromFGService(456)
        if (Looper.getMainLooper() == Looper.myLooper())
            Log.e("moh", "FGService running on main thread (good)")
        else
            Log.e("moh", "FGService not running on main thread (bad, not as expected)")
    }

    fun fromMainActivity(data: Int) {
        Log.e("moh", "FGService received some data from MainActivity: $data")
    }

    override fun onDestroy() {
        super.onDestroy()
        sngltn = null
    }
}

相关问题