桌面小部件(Appwidget)的列表ListView点击启动Activity失败的解决方案

本文主要是介绍桌面小部件(Appwidget)的列表ListView点击启动Activity失败的解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、问题现象

在这里插入图片描述

点击列表项ItemView启动startActivity始终没反应。

原来的老版本写法如下:

//RemoteViewsFactory类override fun getViewAt(position: Int): RemoteViews? {val fillInIntent = Intent()//item点击时传递的参数fillInIntent.putExtra(FullTextActivity.EXTRA_BEAN, listData[position])rv.setOnClickFillInIntent(R.id.itemText, fillInIntent)return rv
}
//AppWidgetProvider类
override fun onUpdate( context: Context,  appWidgetManager: AppWidgetManager,  appWidgetIds: IntArray ) {val clickIntent = Intent(context, WidgetProvider::class.java)clickIntent.action = clickActionclickIntent.data = Uri.parse(clickIntent.toUri(Intent.URI_INTENT_SCHEME))//关键就是这一行val pendingIntentTemplate = PendingIntent.getBroadcast(context, 0, clickIntent,PendingIntent.FLAG_UPDATE_CURRENT)remoteViews.setPendingIntentTemplate(R.id.list_view, pendingIntentTemplate)
}override fun onReceive(context: Context, intent: Intent) {super.onReceive(context, intent)val action = intent.actionwhen (action) {clickAction -> {val toIntent = Intent(context, FullTextActivity::class.java)toIntent.putExtra(FullTextActivity.EXTRA_BEAN,intent.getSerializableExtra(FullTextActivity.EXTRA_BEAN))toIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)context.startActivity(toIntent)}}}

最终原因是因为:通过PendingIntent.getBroadcast 广播的形式启动Activity,这个操作已经在Android10(Q)开始不生效了。

Android10(Q)新增了后台启动 Acitvity 限制新特性:

禁止无用户交互的后台启动activity。
在后台,通过Notification也可以启动activity,但是通过alarm定时器无法启动activity。

允许Activity Starts的条件:

该应用有可见的窗口,例如有一个activity在前台
该应用程序有一个activity在foreground task
可见的应用程序绑定到应用程序的service
可见的应用程序发送该应用程序的pending intent
系统发送该应用程序的pending intent
系统发送broadcast到该应用程序
系统绑定到应用程序的服务
应用程序与配套硬件设备相关联
改应用程序是Device Policy Controller

简单来说,本次遇到的情况就是,通过Broadcast 或者Service去直接启动Activity将会导致失败。

2、解决方案

把PendingIntent.getBroadcast 换成 PendingIntent.getActivity即可。

//RemoteViewsFactory类override fun getViewAt(position: Int): RemoteViews? {val fillInIntent = Intent()//item点击时传递的参数fillInIntent.putExtra(FullTextActivity.EXTRA_BEAN, listData[position])rv.setOnClickFillInIntent(R.id.itemText, fillInIntent)return rv
}//AppWidgetProvider类
override fun onUpdate( context: Context,  appWidgetManager: AppWidgetManager,  appWidgetIds: IntArray ) {val itemIntent =  Intent(context, FullTextActivity::class.java)val listPendingIntent = PendingIntent.getActivity(context, 0, itemIntent, PendingIntent.FLAG_UPDATE_CURRENT)remoteViews.setPendingIntentTemplate(R.id.list_view, listPendingIntent)
}

3、参考链接

Android-Q 对 startActivity() 做了限制,怎么适配?

这篇关于桌面小部件(Appwidget)的列表ListView点击启动Activity失败的解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/586496

相关文章

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

kkFileView在线预览office的常见问题以及解决方案

《kkFileView在线预览office的常见问题以及解决方案》kkFileView在线预览Office常见问题包括base64编码配置、Office组件安装、乱码处理及水印添加,解决方案涉及版本适... 目录kkFileView在线预览office的常见问题1.base642.提示找不到OFFICE组件

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin