本文主要是介绍桌面小部件(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失败的解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!