桌面小部件(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 = 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() 做了限制,怎么适配?

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值