为什么我的PendingIntent无法从Android小部件集OnClickPendingIntent广播/接收?

svmlkihl  于 2023-03-21  发布在  Android
关注(0)|答案(1)|浏览(124)

AppWidget.kt:

override fun onEnabled(context: Context) {
    // register price and widget button update receivers
    val filters = IntentFilter()
    filters.addAction(BROADCAST_PRICE_UPDATED)
    filters.addAction(BROADCAST_WIDGET_UPDATE_BUTTON_CLICK)
    LocalBroadcastManager.getInstance(context.applicationContext).registerReceiver(br, filters)
}

override fun onDisabled(context: Context) {
    // unregister price and widget button update receivers
    LocalBroadcastManager.getInstance(context.applicationContext).unregisterReceiver(br)
}

    private val br = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) { ... }

注:本地广播接收器接收所有其他已注册的广播,但来自 piWidgetUpdateButtonClicked 的广播除外。使用LocalBroadcastManager是我能够发送/接收广播的唯一方法,因为使用全局广播系统显然会过滤掉我的应用程序包中的广播?

internal fun updateAppWidget(context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int) {

// Construct the RemoteViews object
val views = RemoteViews(context.packageName, R.layout.app_widget)

// Create an Intent to launch MainActivity when widget background touched
val piLaunchMainActiv: PendingIntent = PendingIntent.getActivity(context,0,
    Intent(context.applicationContext, MainActivity::class.java),
    PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
    )
views.setOnClickPendingIntent(R.id.widget_background_layout, piLaunchMainActiv)

// create intent to update widget when button clicked TODO this not working
val piWidgetUpdateButtonClicked =
    PendingIntent.getBroadcast(context, appWidgetId,
        Intent(BROADCAST_WIDGET_UPDATE_BUTTON_CLICK), PendingIntent.FLAG_UPDATE_CURRENT
                or PendingIntent.FLAG_IMMUTABLE
    )
views.setOnClickPendingIntent(R.id.widget_update_button, piWidgetUpdateButtonClicked)

注意:*piLauchMainActiv * 挂起Intent工作正常,但 piWidgetUpdateButtonClicked 没有任何作用。我尝试使用上下文。applicationContext也没有任何作用。我还尝试显式设置接收类:意图.setClass(上下文,应用小部件::class.java),没有任何内容。
显然,最新的Google Android版本希望您以编程方式注册广播接收器,就像我上面所做的那样,而不是在清单中注册,我也尝试过,但也不起作用:
AndroidManifest.xml:

<receiver
        android:name=".AppWidget"
        android:exported="false">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <intent-filter>
            <action android:name="org.bitanon.bitcointicker.BROADCAST_PRICE_UPDATED" />
        </intent-filter>
        <intent-filter>
            <action android:name="org.bitanon.bitcointicker.BROADCAST_WIDGET_UPDATE_BUTTON_CLICK" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/app_widget_info" />
    </receiver>

在阅读了stackoverflow上的其他相关帖子之后,没有任何帮助。我完全被难倒了,请发送帮助!

vktxenjb

vktxenjb1#

这是在三星手机上吗?我注意到三星手机会阻止在后台启动服务(可能还有发送广播),例如从小部件启动服务,除非您禁用应用的电池优化。最好启动Activity(它可以是一个透明的Activity,只是执行操作并退出,或者启动服务或其他)

相关问题