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 = clickAction
clickIntent.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.action
when (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() 做了限制,怎么适配?