<receiver> class 没有注册从同一应用程序发送的隐式意图?

<receiver> class not registering implicit intent sent from same app?

我有一个 Android 应用程序,其主屏幕小部件带有按钮。设置小部件时,我使用代码:

    Intent intentPlayPause = new Intent(context.getString(R.string.WidgetPlayPauseKey));
    PendingIntent pendingIntentPlayPause = PendingIntent.getBroadcast(context, i, intentPlayPause, 0);
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main_widget);
    views.setOnClickPendingIntent(R.id.widgetPlayPauseButton, pendingIntentPlayPause);

我有一个专门的 class 来接收小部件广播和做一些其他基本的事情。永远不会调用 onReceive 方法。这是其中的一些代码:

public class WidgetBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Log.e("Sleep Timer", "Receiver Bcast in widget receiver: " + intent.getAction());
    }
}

并且在该接收器的清单中 class:

        <receiver
            android:name=".WidgetBroadcastReceiver"
            android:exported="false"
            android:enabled="true">
            <intent-filter>
                <action android:name="@string/WidgetStopKey" />
                <action android:name="@string/WidgetPlayPauseKey" />
            </intent-filter>
        </receiver>

但是从来没有调用过 onReceive 方法。如果我将按钮更改为使用显式意图而不是隐式意图,它可以正常工作,但我想知道为什么它不适用于隐式意图。我在我的应用程序的另一部分遇到了同样的问题,所以我真的很想知道为什么接收者没有注册隐式意图。另外,我尝试在清单中的接收器和小部件 classes 上将 "exported" 更改为 true 但这没有帮助。

感谢您的帮助。 :)

您必须使用简单的字符串,而不是清单文件中资源中的字符串。我的意思是您的广播接收器试图捕捉即“@string/blabla”而不是您的想法。

改为'my.custom.receiver.the.best.of.all':

<action android:name="my.custom.receiver.the.best.of.all" />