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

相关文章

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

Python安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Java下载文件中文文件名乱码的解决方案(文件名包含很多%)

《Java下载文件中文文件名乱码的解决方案(文件名包含很多%)》Java下载文件时,文件名中文乱码问题通常是由于编码不正确导致的,使用`URLEncoder.encode(filepath,UTF-8... 目录Java下载文件中文文件名乱码问题一般情况下,大家都是这样为了解决这个问题最终解决总结Java下

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

Windows设置nginx启动端口的方法

《Windows设置nginx启动端口的方法》在服务器配置与开发过程中,nginx作为一款高效的HTTP和反向代理服务器,被广泛应用,而在Windows系统中,合理设置nginx的启动端口,是确保其正... 目录一、为什么要设置 nginx 启动端口二、设置步骤三、常见问题及解决一、为什么要设置 nginx

springboot启动流程过程

《springboot启动流程过程》SpringBoot简化了Spring框架的使用,通过创建`SpringApplication`对象,判断应用类型并设置初始化器和监听器,在`run`方法中,读取配... 目录springboot启动流程springboot程序启动入口1.创建SpringApplicat

树莓派启动python的实现方法

《树莓派启动python的实现方法》本文主要介绍了树莓派启动python的实现方法,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、RASPBerry系统设置二、使用sandroidsh连接上开发板Raspberry Pi三、运