web-dev-qa-db-ja.com

Androidブロードキャストレシーバーが機能しない

放送受信機を動かそうとしています。できるだけシンプルにする必要があります。マニフェストは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.mytest.intentRec" Android:versionCode="1"
    Android:versionName="1.0">
    <application Android:icon="@drawable/icon" Android:label="@string/app_name"
        Android:debuggable="true">
        <activity Android:name=".mainAct" 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.mytest.intentRec.MyIntentRec"
                  Android:enabled="true" >
        </receiver>
    </application>
    <uses-sdk Android:minSdkVersion="7" />
</manifest> 

ご覧のとおり、メインアクティビティmainActがあります。これは、開始後にブロードキャストを送信するだけです。

public class mainAct extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        this.sendBroadcast(new Intent());
    }
}

myIntentRecクラスがあります。これは可能な限り単純です。

public class MyIntentRec extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.v("IntentRec", "got it");
    }
}

私が期待しているのは、アプリを起動すると、ブロードキャストが送信されてピックアップされ、ログエントリが書き込まれることです。そのログエントリが表示されず、エラーも表示されません。マニフェストまたはブロードキャストの送信にエラーがあるのではないかと疑っています。そこで空のインテントを作成しましたが、特定のプロパティを持つインテントである必要がありますか?

11
AndyAndroid

あなたの意図のためにsetClassしてください、

例:

public class mainAct extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Intent i=new Intent("any string");
        i.setClass(this, MyIntentRec.class);
        this.sendBroadcast(i);
    }
}

これは、「フィルターがないということは、正確なクラス名を指定するIntentオブジェクトによってのみ呼び出すことができることを意味します」という意味です。

[古い答え]
マニフェストに必要なアクションの種類を登録する必要があります。
例:

    <receiver Android:name="com.mytest.intentRec.MyIntentRec" Android:enabled="true" >
        <intent-filter>
            <action  Android:name="your.intent" />
        </intent-filter>
    </receiver>

それを送る、

this.sendBroadcast(new Intent("your.intent"));
14
Jett Hsieh

new Intent();だけを作成するだけでは不十分です。何らかのアクションで指定する必要があります。また、マニフェストでこの特定のアクションのインテントフィルターを指定する必要があります。続きを読む ここここ

1
Vladimir Ivanov

BroadcastReceiverのマニフェストでインテントフィルターを定義していません。カスタムアクションタイプに1つ指定します。また、起動時にブロードキャストしたインテントでこのカスタムアクションタイプを定義する必要があります。

受信者がマニフェストでキャッチする必要のあるアクションを指定してみてください。あなたはそのようにこれを行うことができます:

<receiver Android:name="com.mytest.intentRec.MyIntentRec">
    <intent-filter>
        <action Android:name="Android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>
1
tvkanters