-2

wn URI に基づいて、単純なカスタム インテントを受信しようとしています。

これが私のマニフェストです:

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="17" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.intenttest.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver
        android:name="com.example.intenttest.TestReceive"
        android:enabled="true"
        android:exported="true" >
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data android:scheme="testo" />
        </intent-filter>
    </receiver>
</application>

私の受信機は非常に単純です。

public class TestReceive extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent arg1) {
    Log.d("", "YAY!!!!!");

        Toast.makeText(context, "TEST!!!", Toast.LENGTH_LONG).show();
    }

}

testo://blahblah をブラウジングしようとしたり、URI Launer を介してこのインテントを実行しようとすると、レシーバーが起動されません。

別のアプリからのインテントの起動をシミュレートするコードを次に示します。

        String url = "testo://test/test";
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setData(Uri.parse(url));
        sendBroadcast( i );

しかし、<intent-filer>ブロックを<activity>マニフェストのタグに移動すると、アクティビティが発生します。

受信者にインテントを受信させるにはどうすればよいですか?

4

2 に答える 2

1

受信者を動的に登録しようとしている場合は、プログラムで行う必要があります。Eric Nordvikによるこの例は、うまく機能します。

さて、このようにする主な理由は、それが簡単だからです。欠点は、アプリケーションのライフサイクルが現在アクティブでないときにブロードキャストを受信できないことです ( pausedstopped)。

更新:コメントで読んだように、OP はアクティビティのライフサイクルとは無関係にブロードキャストを受信する必要があります。自分のデザインを再考して、それが本当に必要かどうかを判断してください。

公式ドキュメントで指定されているandroid:nameように、 を実装するクラスの名前を指定するために使用されBroadcastReceiverます。コードでそれを省略すると、Activityそれ自体がブロードキャストを受信することになります。あなたの問題は、あなたがそれを完全に修飾しなかったandroid:nameが、それを と呼んだことだと思いますname. それを修正すると、問題も修正されるはずです。

更新: OP はその後タイプミスを修正しましたが、これは問題ではありません。この時点で、私の最善の推測は、ブロードキャストが間違って生成されているか、 への参照 BroadcastReceiverで簡略表記を使用する必要があるということandroid:name=".NameOfReceiverClass"です。

于 2013-08-13T12:09:54.833 に答える