[Android] BroadcastReceiver(Action_headset_plug)没有解雇

时间:2011-09-20 06:39:19

标签: android

我在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();

        } 

    } 
}

3 个答案:

答案 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