web-dev-qa-db-ja.com

AndroidManifest.xmlでカスタムインテントフィルターをブロードキャストレシーバーに登録するにはどうすればよいですか?

PlAY_FINISHEDアクションを受信するようにAndroidManifest.xmlでレシーバーを定義しました。他のファイルでは、次のようにそのブロードキャストレシーバーにインテントを送信します。

public String PlAY_FINISHED = "play finished"; 
...
Intent in = new Intent(PlAY_FINISHED);
this.service.sendBroadcast(in);

したがって、マニフェストファイルでは、次のように設定します。ここで、MyStaticStringは、アプリケーション内のすべての静的文字列を含むクラスです。これは正しい方法ですか?

    <intent-filter>
        <action Android:name="com.mysite.appname.MyStaticString.PLAY_FINISHED" />
    </intent-filter>
9
Jolin

マニフェストのインテントフィルタのAndroid:nameは単なる任意の文字列であり、Java定数へのパス」ではありません。問題は、コードの文字列定数が次のように定義されていることです。 "play finished"、これはマニフェストで指定した名前"com.mysite.appname.MyStaticString.PLAY_FINISHED"と一致しません。

そのはず

public String PlAY_FINISHED = "com.mysite.appname.MyStaticString.PLAY_FINISHED";

変数が何と呼ばれるかは関係ありません。また、文字列を変数に格納する場合でも関係ありません。または、その名前にタイプミスが含まれていること:)

代わりに、マニフェストのAndroid:name"play finished"に変更することもできますが、カスタムブロードキャストアクションはシステム全体であるため、他のアプリとの衝突を避けるために、アプリのパッケージ名で修飾する必要があります。

12
Karu

Androidマニフェストファイルに登録

<receiver Android:name=".ReceiverDemo">
  <intent-filter>
    <action Android:name="marakana.intent.action.ReceiverDemo" />
  </intent-filter>
</receiver>

プログラムで登録します。

...
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  ...
  // Create the receiver
  receiver = new TimelineReceiver();
  filter = new IntentFilter( UpdaterService.NEW_STATUS_INTENT );
}

protected void onResume() {
  super.onResume();
  super.registerReceiver(receiver, filter,
      "com.marakana.yamba.SEND_TIMELINE_NOTIFICATIONS", null);
}

@Override
protected void onPause() {
  super.onPause();
  unregisterReceiver(receiver);
}
...

更新:複数の値複数の値を指定できる場合、要素は、単一の要素内に複数の値をリストするのではなく、ほとんどの場合繰り返されます。たとえば、インテントフィルターは複数のアクションをリストできます:

<intent-filter . . . >
    <action Android:name="Android.intent.action.EDIT" />
    <action Android:name="Android.intent.action.INSERT" />
    <action Android:name="Android.intent.action.DELETE" />
    . . .
</intent-filter>

UPDATE2:これはAndroidManifest.xmlの例です

<manifest
  package="com.marakana.Android.lifecycle"
  Android:versionCode="1"
  Android:versionName="1.0" xmlns:Android="http://schemas.Android.com/apk/res/Android">
  <uses-sdk
    Android:minSdkVersion="10"
    Android:targetSdkVersion="11" />
  <uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"></uses-permission>

  <application
    Android:name=".ApplicationDemo"
    Android:icon="@drawable/icon"
    Android:label="@string/app_name">
    <activity
      Android:name=".ActivityDemo"
      Android:label="@string/app_name">
      <intent-filter>
        <action Android:name="Android.intent.action.MAIN" />
        <category Android:name="Android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>

    <activity Android:name=".AnotherActivity"></activity>

    <activity Android:name=".SystemServicesDemo"></activity>

    <service Android:name=".ServiceDemo"></service>

    <service Android:name=".IntentServiceDemo">
      <intent-filter>
        <action Android:name="marakana.intent.action.IntentServiceDemo" />
      </intent-filter>
    </service>

    <receiver Android:name=".ReceiverDemo">
      <intent-filter>
        <action Android:name="marakana.intent.action.ReceiverDemo" />
      </intent-filter>
    </receiver>

    <provider
      Android:name=".ProviderDemo"
      Android:authorities="com.marakana.Android.lifecycle.providerdemo" />

  </application>
</manifest>
6
NMALKO