1

私はボタンを持つホームスクリーンウィジェットを持つAndroidアプリを持っています。ウィジェットを設定するとき、私はコードを使用します:<receiver>同じアプリから送信された暗黙インテントがクラスに登録されていませんか?

私はウィジェットのブロードキャストを受信し、いくつかの他の基本的なことを行う専用のクラスを持っています。 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()); 
    } 
} 

そして、この受信機クラスのマニフェストで:ここにいるからいくつかのコードです

 <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方法は、単純に呼び出されることはありません。私が暗黙のインテントの代わりに明示的なインテントを使用するようにボタンを変更すると、正常に動作しますが、暗黙のインテントで動作しない理由を知りたいと思います。私はアプリの別の部分で同じ問題を抱えているので、なぜ受信者が暗黙的なインテントを登録していないのかを知りたいのです。また、マニフェストのレシーバクラスとウィジェットクラスの両方で "exported"をtrueに変更しようとしましたが、それは役に立ちません。

ありがとうございました。 :)

+0

あなた 'targetSdkVersion'は何ですか? – ianhanniballake

+0

minSdkVersion 18 targetSdkVersion 26 – Shredder2794

+0

「暗黙のインテントの代わりに明示的なインテントを使用するようにボタンを変更すると、正常に動作します」 - セキュリティの欠陥が修正されます(現在、どのアプリでもブロードキャストを送信できます)。あなたの受信機に)、それはAndroid 8.0以降で動作します(暗黙のブロードキャストでは動作しません)。 Vyacheslavが示唆しているように、「」要素で 'android:name'の文字列リソースを使用しないようにしてください。 – CommonsWare

答えて

3

マニフェストファイルのリソースの文字列ではなく、単純な文字列を使用する必要があります。あなたの放送受信機はあなたのアイデアの代わりに '@ string/blabla'をキャッチしようとします。

'my.custom.receiver.the.best.of.all' に変更します。

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

+0

それはそれでした!好奇心のために、マニフェストのアクション名にリテラル文字列の代わりにリソースを使用する方法を知っていますか? – Shredder2794

+0

リソースの使用の場合、この強みは異なる場合があります。値と値、例えば、異なる値を持っている – Vyacheslav

+1

@ Shredder2794これを防ぐために、Googleの開発者はこの機能を削除した – Vyacheslav

関連する問題