桌面小部件(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

相关文章

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

html 滚动条滚动过快会留下边框线的解决方案

《html滚动条滚动过快会留下边框线的解决方案》:本文主要介绍了html滚动条滚动过快会留下边框线的解决方案,解决方法很简单,详细内容请阅读本文,希望能对你有所帮助... 滚动条滚动过快时,会留下边框线但其实大部分时候是这样的,没有多出边框线的滚动条滚动过快时留下边框线的问题通常与滚动条样式和滚动行

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地