IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 小组件完整案例 -> 正文阅读

[移动开发]Android 小组件完整案例

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

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

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

....
<receiver android:name=".appwidget.HanlonglinWidgetProvider"
           android:exported="false">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data android:name="android.appwidget.provider"
                android:resource="@xml/app_widget" />
</receiver>
....

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

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="90dp"
    android:minHeight="90dp"
    android:updatePeriodMillis="1800000"
    android:initialLayout="@layout/moment_widget_moment"
    android:widgetCategory="home_screen">
</appwidget-provider>
HanlonglinWidgetProvider.kt: (小组件绑定view的类)
package com.dragon.test.hanlonglindemo.appwidget

import android.app.PendingIntent
import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProvider
import android.content.Context
import android.content.Intent
import android.util.Log
import android.widget.RemoteViews
import com.dragon.test.hanlonglindemo.MainActivity
import com.dragon.test.hanlonglindemo.R


/***
 *  create by DragonForest on 2022/4/15
 */
class HanlonglinWidgetProvider: AppWidgetProvider() {
    private val TAG = this.javaClass.simpleName
    override fun onUpdate(
        context: Context?,
        appWidgetManager: AppWidgetManager?,
        appWidgetIds: IntArray?
    ) {
        Log.i(TAG, "HanlonglinWidgetProvider.onUpdate")
        appWidgetIds?.forEach { appWidgetId ->
            val views: RemoteViews = RemoteViews(
                context?.packageName,
                R.layout.widget_layout
            )
            var intent = Intent(context, MainActivity::class.java)
            var pendingIntent = PendingIntent.getActivity(
                context,
                0,
                intent,
                PendingIntent.FLAG_UPDATE_CURRENT
            )
            views.setOnClickPendingIntent(R.id.iv_widget, pendingIntent)
            appWidgetManager?.updateAppWidget(appWidgetId, views)
        }
    }

    companion object{
        /**
         * 更新组件调用
         */
        fun updateAppWidget(
            context: Context?,
            appWidgetManager: AppWidgetManager?,
            appWidgetId: Int,
            imgRes: Int
        ){
            val views = RemoteViews(context!!.packageName, R.layout.widget_layout)
            views.setImageViewResource(R.id.iv_widget,imgRes)
            appWidgetManager?.updateAppWidget(appWidgetId,views)
        }
    }
}
WidgetController.kt: (小组件操作类)
package com.dragon.test.hanlonglindemo.appwidget

import android.app.PendingIntent
import android.appwidget.AppWidgetManager
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.widget.Toast
import androidx.annotation.RequiresApi

/***
 *  小组件操作类
 *  create by DragonForest on 2022/4/15
 */
object WidgetController {
    private val TAG = this.javaClass.simpleName

    /**
     * 更新小组件,触发组件的onUpdate
     */
    fun update(context: Context){
        var intent = Intent(context,HanlonglinWidgetProvider::class.java)
        intent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
        var bundle = Bundle()
        bundle.putIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS, getAppWidgetIds(context))
        intent.putExtras(bundle)
        context.sendBroadcast(intent)
    }

    /**
     * 添加到主屏幕
     */
    @RequiresApi(Build.VERSION_CODES.O)
    fun addToMainScreen(context: Context){
        val appWidgetManager = AppWidgetManager.getInstance(context)
        val myProvider = ComponentName(context, HanlonglinWidgetProvider::class.java)

        if (getAppWidgetIds(context).isNotEmpty()) {
            Toast.makeText(context,"组件已经存在",Toast.LENGTH_SHORT).show()
            return
        }
        if (appWidgetManager.isRequestPinAppWidgetSupported()) {
            // Create the PendingIntent object only if your app needs to be notified
            // that the user allowed the widget to be pinned. Note that, if the pinning
            // operation fails, your app isn't notified. This callback receives the ID
            // of the newly-pinned widget (EXTRA_APPWIDGET_ID).
//            val successCallback = PendingIntent.getBroadcast(
//                /* context = */ context,
//                /* requestCode = */ 0,
//                /* intent = */ null,
//            /* flags = */ PendingIntent.FLAG_UPDATE_CURRENT)

            appWidgetManager.requestPinAppWidget(myProvider, null, null)
        }
    }
    private fun getAppWidgetIds(context: Context) :IntArray{
        var awm = AppWidgetManager.getInstance(context)
        val appWidgetIDs: IntArray = awm.getAppWidgetIds(ComponentName(context,HanlonglinWidgetProvider::class.java))
        return appWidgetIDs
    }
}
WidgetTestActivity.kt:  (测试页面,用来展示操作)
package com.dragon.test.hanlonglindemo.appwidget

import android.app.Activity
import android.os.Build
import android.os.Bundle
import androidx.annotation.RequiresApi
import com.dragon.test.hanlonglindemo.R
import kotlinx.android.synthetic.main.activity_widget_test.*

/***
 *  create by DragonForest on 2022/4/15
 */
class WidgetTestActivity: Activity() {
    @RequiresApi(Build.VERSION_CODES.O)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_widget_test)
        btn_add_to_screen.setOnClickListener {
            WidgetController.addToMainScreen(this)
        }
    }
}

注意的地方,

更多信息:?

Enable users to configure app widgets ?|? Android Developers

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:54:07  更:2022-04-18 17:56:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 21:43:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码