Android 如何从AppWidgetProvider调用ViewModel函数?

Android 如何从AppWidgetProvider调用ViewModel函数?,android,api,rest,mvvm,widget,Android,Api,Rest,Mvvm,Widget,我有一个2 API: interface Api { @POST("/my/url") suspend fun function() } My ViewModel可以调用此HTTP函数: class MainViewModel : ViewModel() { private val retrofiClient = APIClient.client!!.create(Api::class.java) fun test() {

我有一个2 API:

interface Api {
    @POST("/my/url")
    suspend fun function()
}
My ViewModel可以调用此HTTP函数:

class MainViewModel : ViewModel() {

    private val retrofiClient = APIClient.client!!.create(Api::class.java)

    fun test() {
        viewModelScope.launch {
                retrofitClient.function()
        }
    }
}
当我从我的活动中调用此项时,没有问题

但我的目标是从我的应用程序的小部件调用这个test()函数。 我的基本AppWidgetProvider如下所示:

class AppWidgetProvider : AppWidgetProvider() {

    override fun onUpdate(
        context: Context,
        appWidgetManager: AppWidgetManager,
        appWidgetIds: IntArray
    ) {
        // Perform this loop procedure for each App Widget that belongs to this provider
        appWidgetIds.forEach { appWidgetId ->

            val intent = Intent()
            intent.action = "custom-event-name"
            intent.setClassName(
                MainActivity::class.java.getPackage().name,
                MainActivity::class.java.name
            )

            val pendingIntent = PendingIntent.getBroadcast(
                context.applicationContext,
                0,
                intent,
                PendingIntent.FLAG_CANCEL_CURRENT
            )
            val views: RemoteViews = RemoteViews(
                context.packageName,
                R.layout.appwidget
            ).apply {
                setOnClickPendingIntent(R.id.test, pendingIntent)
            }

            appWidgetManager.updateAppWidget(appWidgetId, views)
        }
    }
}
主要活动:

class MainActivity : AppCompatActivity() {

    private val receiver: BroadcastReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            println("INTENT RECEIVED")

        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        registerReceiver(receiver, IntentFilter("custom-event-name"))
        ...
    }
BroadcastReceiver未接收到该意图。即使有,我可以在那里调用我的应用程序功能吗


我如何设置我的应用程序和/或小部件,以便在单击小部件中的按钮时调用此viewModel.test()方法?

您可以使用
频道(对于协同路由)或
RxRelay
(对于rxjava)而不是使用广播接收器。只需将你的
频道
中继
实例放在你的应用程序类上,这样你就可以跨你的活动、片段等访问它。

你能详细说明一下小部件和应用程序之间如何通过频道进行通信吗?这与事件总线的方法相同。您可以将频道放入应用程序类中。然后在
AppWidgetProvider
中,传递app-cnText而不是contxt,或者传递app-contxt和contxt(无论您选择哪个)。例如,从您的小部件中,您想将数据发送到您的片段,首先观察片段中的通道,例如(不是精确的代码)
application.yourChannel.receiveAsFlow().onEach..
,然后当您想从小部件发送数据时,您可以执行
application.yourChannel.offer(dataYouWantToSend)
。因此,每次您
提供
,它都将在
receiveAsFlow.onEach上接收,或者您可以创建一个单例/对象类来处理您的频道实例(而不是将其放在应用程序类上)