桌面小部件(Appwidget)的列表ListView点击启动Activity失败的解决方案

发布时间:2024年01月08日

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() 做了限制,怎么适配?

文章来源:https://blog.csdn.net/huangbin123/article/details/135459026
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。