• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Android 小组件完整案例

武飞扬头像
龍林1102
帮助1

介绍一下android桌面小组件完整的案例,包括:

  • 注册一个小组件(系统中能找到并添加小组件)
  • 更新小组件数据
  • 应用主动添加小组件
  • 小组件中的坑

AndroidManifest.xml:  (小组件注册, 其本质是一个BroadcastReceiver)

  1.  
    ....
  2.  
    <receiver android:name=".appwidget.HanlonglinWidgetProvider"
  3.  
    android:exported="false">
  4.  
    <intent-filter>
  5.  
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
  6.  
    </intent-filter>
  7.  
    <meta-data android:name="android.appwidget.provider"
  8.  
    android:resource="@xml/app_widget" />
  9.  
    </receiver>
  10.  
    ....

xml/app_widget.xml: (小组件配置信息)

  1.  
    <?xml version="1.0" encoding="utf-8"?>
  2.  
    <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
  3.  
    android:minWidth="90dp"
  4.  
    android:minHeight="90dp"
  5.  
    android:updatePeriodMillis="1800000"
  6.  
    android:initialLayout="@layout/moment_widget_moment"
  7.  
    android:widgetCategory="home_screen">
  8.  
    </appwidget-provider>
HanlonglinWidgetProvider.kt: (小组件绑定view的类)
  1.  
    package com.dragon.test.hanlonglindemo.appwidget
  2.  
     
  3.  
    import android.app.PendingIntent
  4.  
    import android.appwidget.AppWidgetManager
  5.  
    import android.appwidget.AppWidgetProvider
  6.  
    import android.content.Context
  7.  
    import android.content.Intent
  8.  
    import android.util.Log
  9.  
    import android.widget.RemoteViews
  10.  
    import com.dragon.test.hanlonglindemo.MainActivity
  11.  
    import com.dragon.test.hanlonglindemo.R
  12.  
     
  13.  
     
  14.  
    /***
  15.  
    * create by DragonForest on 2022/4/15
  16.  
    */
  17.  
    class HanlonglinWidgetProvider: AppWidgetProvider() {
  18.  
    private val TAG = this.javaClass.simpleName
  19.  
    override fun onUpdate(
  20.  
    context: Context?,
  21.  
    appWidgetManager: AppWidgetManager?,
  22.  
    appWidgetIds: IntArray?
  23.  
    ) {
  24.  
    Log.i(TAG, "HanlonglinWidgetProvider.onUpdate")
  25.  
    appWidgetIds?.forEach { appWidgetId ->
  26.  
    val views: RemoteViews = RemoteViews(
  27.  
    context?.packageName,
  28.  
    R.layout.widget_layout
  29.  
    )
  30.  
    var intent = Intent(context, MainActivity::class.java)
  31.  
    var pendingIntent = PendingIntent.getActivity(
  32.  
    context,
  33.  
    0,
  34.  
    intent,
  35.  
    PendingIntent.FLAG_UPDATE_CURRENT
  36.  
    )
  37.  
    views.setOnClickPendingIntent(R.id.iv_widget, pendingIntent)
  38.  
    appWidgetManager?.updateAppWidget(appWidgetId, views)
  39.  
    }
  40.  
    }
  41.  
     
  42.  
    companion object{
  43.  
    /**
  44.  
    * 更新组件调用
  45.  
    */
  46.  
    fun updateAppWidget(
  47.  
    context: Context?,
  48.  
    appWidgetManager: AppWidgetManager?,
  49.  
    appWidgetId: Int,
  50.  
    imgRes: Int
  51.  
    ){
  52.  
    val views = RemoteViews(context!!.packageName, R.layout.widget_layout)
  53.  
    views.setImageViewResource(R.id.iv_widget,imgRes)
  54.  
    appWidgetManager?.updateAppWidget(appWidgetId,views)
  55.  
    }
  56.  
    }
  57.  
    }
学新通
WidgetController.kt: (小组件操作类)
  1.  
    package com.dragon.test.hanlonglindemo.appwidget
  2.  
     
  3.  
    import android.app.PendingIntent
  4.  
    import android.appwidget.AppWidgetManager
  5.  
    import android.content.ComponentName
  6.  
    import android.content.Context
  7.  
    import android.content.Intent
  8.  
    import android.os.Build
  9.  
    import android.os.Bundle
  10.  
    import android.widget.Toast
  11.  
    import androidx.annotation.RequiresApi
  12.  
     
  13.  
    /***
  14.  
    * 小组件操作类
  15.  
    * create by DragonForest on 2022/4/15
  16.  
    */
  17.  
    object WidgetController {
  18.  
    private val TAG = this.javaClass.simpleName
  19.  
     
  20.  
    /**
  21.  
    * 更新小组件,触发组件的onUpdate
  22.  
    */
  23.  
    fun update(context: Context){
  24.  
    var intent = Intent(context,HanlonglinWidgetProvider::class.java)
  25.  
    intent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
  26.  
    var bundle = Bundle()
  27.  
    bundle.putIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS, getAppWidgetIds(context))
  28.  
    intent.putExtras(bundle)
  29.  
    context.sendBroadcast(intent)
  30.  
    }
  31.  
     
  32.  
    /**
  33.  
    * 添加到主屏幕
  34.  
    */
  35.  
    @RequiresApi(Build.VERSION_CODES.O)
  36.  
    fun addToMainScreen(context: Context){
  37.  
    val appWidgetManager = AppWidgetManager.getInstance(context)
  38.  
    val myProvider = ComponentName(context, HanlonglinWidgetProvider::class.java)
  39.  
     
  40.  
    if (getAppWidgetIds(context).isNotEmpty()) {
  41.  
    Toast.makeText(context,"组件已经存在",Toast.LENGTH_SHORT).show()
  42.  
    return
  43.  
    }
  44.  
    if (appWidgetManager.isRequestPinAppWidgetSupported()) {
  45.  
    // Create the PendingIntent object only if your app needs to be notified
  46.  
    // that the user allowed the widget to be pinned. Note that, if the pinning
  47.  
    // operation fails, your app isn't notified. This callback receives the ID
  48.  
    // of the newly-pinned widget (EXTRA_APPWIDGET_ID).
  49.  
    // val successCallback = PendingIntent.getBroadcast(
  50.  
    // /* context = */ context,
  51.  
    // /* requestCode = */ 0,
  52.  
    // /* intent = */ null,
  53.  
    // /* flags = */ PendingIntent.FLAG_UPDATE_CURRENT)
  54.  
     
  55.  
    appWidgetManager.requestPinAppWidget(myProvider, null, null)
  56.  
    }
  57.  
    }
  58.  
    private fun getAppWidgetIds(context: Context) :IntArray{
  59.  
    var awm = AppWidgetManager.getInstance(context)
  60.  
    val appWidgetIDs: IntArray = awm.getAppWidgetIds(ComponentName(context,HanlonglinWidgetProvider::class.java))
  61.  
    return appWidgetIDs
  62.  
    }
  63.  
    }
学新通
WidgetTestActivity.kt:  (测试页面,用来展示操作)
  1.  
    package com.dragon.test.hanlonglindemo.appwidget
  2.  
     
  3.  
    import android.app.Activity
  4.  
    import android.os.Build
  5.  
    import android.os.Bundle
  6.  
    import androidx.annotation.RequiresApi
  7.  
    import com.dragon.test.hanlonglindemo.R
  8.  
    import kotlinx.android.synthetic.main.activity_widget_test.*
  9.  
     
  10.  
    /***
  11.  
    * create by DragonForest on 2022/4/15
  12.  
    */
  13.  
    class WidgetTestActivity: Activity() {
  14.  
    @RequiresApi(Build.VERSION_CODES.O)
  15.  
    override fun onCreate(savedInstanceState: Bundle?) {
  16.  
    super.onCreate(savedInstanceState)
  17.  
    setContentView(R.layout.activity_widget_test)
  18.  
    btn_add_to_screen.setOnClickListener {
  19.  
    WidgetController.addToMainScreen(this)
  20.  
    }
  21.  
    }
  22.  
    }
学新通

注意的地方,

更多信息: 

Enable users to configure app widgets  |  Android Developers

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfacfh
系列文章
更多 icon
同类精品
更多 icon
继续加载