如何使用Kotlin从API获取数据并在Android App Widget中展示
Kotlin 实现Android API数据拉取并展示到App Widget的步骤
1. 基础配置
- 首先在
AndroidManifest.xml中添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
- 在Module级别的
build.gradle中添加网络请求和协程依赖,这里以OkHttp为例:
implementation 'com.squareup.okhttp3:okhttp:4.12.0' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3'
2. 编写Widget布局文件
在res/layout目录下新建widget_text_display.xml,作为Widget的界面布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp" android:background="#fff"> <TextView android:id="@+id/tv_api_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#000" android:textSize="16sp" android:text="等待加载数据..." /> </LinearLayout>
3. 配置Widget Provider信息
- 在
res/xml目录下新建text_widget_provider.xml,定义Widget的基础属性:
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="180dp" android:minHeight="40dp" android:updatePeriodMillis="1800000" android:initialLayout="@layout/widget_text_display" android:resizeMode="horizontal|vertical" android:widgetCategory="home_screen"> </appwidget-provider>
注意:
updatePeriodMillis设置的是系统自动触发更新的间隔,最小值为1800000毫秒即30分钟,如需更短的更新间隔需自行使用WorkManager或AlarmManager实现。
- 在
AndroidManifest.xml中注册Widget Provider:
<receiver android:name=".TextWidgetProvider" android:exported="true"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/text_widget_provider" /> </receiver>
4. 实现Widget核心逻辑
新建TextWidgetProvider类继承自AppWidgetProvider,在onUpdate方法中实现API拉取和Widget更新逻辑:
class TextWidgetProvider : AppWidgetProvider() { private val okHttpClient = OkHttpClient() override fun onUpdate( context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray ) { // 遍历所有当前添加的Widget实例,逐个更新 appWidgetIds.forEach { widgetId -> // 启动协程执行异步网络请求 CoroutineScope(Dispatchers.IO).launch { val content = fetchDataFromApi("你的API接口地址") // 切回主线程更新Widget withContext(Dispatchers.Main) { val views = RemoteViews(context.packageName, R.layout.widget_text_display) views.setTextViewText(R.id.tv_api_content, content) appWidgetManager.updateAppWidget(widgetId, views) } } } } private fun fetchDataFromApi(apiUrl: String): String { return try { val request = Request.Builder() .url(apiUrl) .build() okHttpClient.newCall(request).execute().body?.string() ?: "接口返回空数据" } catch (e: Exception) { "数据加载失败,请检查网络" } } }
以上代码仅为基础实现,生产环境可根据需求添加缓存、请求重试、加载状态展示等逻辑。
内容的提问来源于stack exchange,提问作者Rowan
相关产品推荐
相关产品推荐

