Android广播接收器不工作

时间:2011-03-29 13:51:33

标签: android android-intent broadcastreceiver

我试图让广播接收器正常工作。应该尽可能简单,我有这样的清单:

<?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");
    }
}

我期望的是,当我启动我的应用程序时,广播被发送并被拾取并且写入了日志条目。我没有看到日志条目,我没有看到任何错误。我怀疑在清单中发送错误或发送广播。我刚刚在那里创建了一个空的意图,是否需要对某些属性有一些意图?

4 个答案:

答案 0 :(得分:12)

setClass获取您的意图,

EX:

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"));

答案 1 :(得分:1)

仅仅制作new Intent();是不够的。你必须用一些动作来指定它。此外,您必须在清单中指定此特定操作的intent过滤器。请阅读更多herehere

答案 2 :(得分:1)

您没有在BroadcastReceiver的清单中定义任何Intent过滤器。为自定义操作类型指定一个。您还必须在启动时的Brodcast中定义此自定义Action类型。

答案 3 :(得分:1)

尝试指定接收方应在清单中捕获的操作。你可以这样做:

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