Android 如何从AppWidgetProvider调用ViewModel函数?
我有一个2 API: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() {
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上接收,或者您可以创建一个单例/对象类来处理您的频道实例(而不是将其放在应用程序类上)