You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 13:54:04