我在AndroidManifest.xml中声明了一个BroadcsastReceiver(Action_headset_plug),并定义了一个BroadcastHandler.class实现BroadcsastReceiver。我在设备上运行apk,接收器不会触发。但是,当我在Activity中使用registerReceiver()时,它可以正常工作。我是否会错过AndroidManifest.xml中的内容?
这是AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="irdc.Earphone_test"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="9" />
<uses-permission android:name="android.permission.ACTION_HEADSET_PLUG"></uses-permission>
<application android:icon="@drawable/icon" android:label="@string/app_name">
<receiver android:enabled="true" android:name="BroadcastHandler">
<intent-filter>
<action android:name="android.intent.ACTION_HEADSET_PLUG"></action>
</intent-filter>
</receiver>
<activity android:name=".Earphone_testActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
这是接收者代码
public class BroadcastHandler extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)){
String mes;
int state = intent.getIntExtra("state", 4);
if(state == 0){
mes ="out";
}else if(state == 1){
mes ="in";
}else {
mes ="others";
}
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Headset broadcast");
builder.setMessage(mes);
builder.setPositiveButton("Okey-dokey", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
}
}
答案 0 :(得分:5)
对于收听耳机更改,广播接收器无法在清单中声明,必须动态注册。并非所有接收器都在清单中声明时工作,这是一个需要以编程方式注册它的示例。
您可以在Activity的 onResume 方法或服务的 onCreate 方法中调用此方法:
headsetReceiver = new BroadcastHandler();
registerReceiver(headsetReceiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG));
然后在Activity的 onPause 方法或服务的 onDestroy 方法中,您需要取消注册接收器:
unregisterReceiver(headsetReceiver);
答案 1 :(得分:1)
清单条目中的名称错误。如果您希望将其隐式附加到应用程序的包名称,请使用完整的包名称,或者以句点开头:
<receiver android:enabled="true" android:name=".BroadcastHandler">
答案 2 :(得分:0)
接收器的大多数示例都不会启动AlertDialog,而是 Toast a message 或在状态栏中创建通知。我确信您无法启动Activity,因为“content”对象会停止存在,但如果您可以构建AlertDialog则不会。 (documentation of Broadcasts)
因此,您可以在接收器上尝试Toast消息以确保其正常工作。
通知示例:http://www.anddev.org/recognize-react_on_incoming_sms-t295.html