Я хочу показать уведомление после того, как гарнитура была подключена и спрятала его после того, как она была отключена. Поэтому я регистрирую ACTION_HEADSET_PLUG Intent Listener в BroadCastReceiver, который запускается на BOOT_COMPLETED. В моем случае я использую HTC Sense (HTC One S), и уведомление отображается только тогда, когда я подключаю гарнитуру, когда Sense загружается (WaitDialog), после чего он больше не будет отображаться.
Если я запускаю OnBootListener в приложении во время выполнения через 'new OnBootreceiver(), onReceive (this, null)' работает отлично.
Manifest:
...
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
...
</activity>
<receiver android:name=".OnBootReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
...
OnBootReceiver:
public void onReceive(Context context, Intent intent) {
IntentFilter receiverFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
HeadsetStateReceiver receiver = new HeadsetStateReceiver();
context.registerReceiver( receiver, receiverFilter );
}
HeadsetStateReceiver:
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,
"" + (Integer) (intent.getExtras().get("state")),
Toast.LENGTH_SHORT).show();
mNotificationManager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
Log.e(this.getClass().toString(), "Intent Headset_plug received "
+ intent);
if ((Integer) (intent.getExtras().get("state")) != 0) {
notification.flags = Notification.FLAG_ONGOING_EVENT;
notification.contentIntent = PendingIntent.getActivity(
context.getApplicationContext(), 0, new Intent(), 0);
notification.setLatestEventInfo(context, title, message,
notification.contentIntent);
mNotificationManager.notify(0xBEA15, notification);
} else {
mNotificationManager.cancelAll();
}
}
Зачем вам нужен BOOT_COMPLETED приемник? Вы пытались получить ACTION_HEADSET_PLUG с использованием файла манифеста?
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
...
</activity>
<receiver android:name=".HeadsetStateReceiver" >
<intent-filter>
<action android:name="android.intent.ACTION_HEADSET_PLUG" />
</intent-filter>
</receiver>
Код yor тоже немного meessy:
public void onReceive(Context context, Intent intent) {
boolean isConnected = intent.getIntExtra("state",0)==1; // Can also be 2 if headset is attached w/o mic.
Toast.makeText(context,
isConnected?"connected":"disconnected"),
Toast.LENGTH_SHORT).show();
mNotificationManager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
if (isConnected) {
Log.e(this.getClass().toString(), "Intent Headset_plug connected");
notification.flags = Notification.FLAG_ONGOING_EVENT;
notification.contentIntent = PendingIntent.getActivity(
context.getApplicationContext(), 0, new Intent(), 0);
notification.setLatestEventInfo(context, title, message,
notification.contentIntent);
mNotificationManager.notify(0xBEA15, notification);
} else {
Log.e(this.getClass().toString(), "Intent Headset_plug disconnected");
mNotificationManager.cancelAll();
}
}
Я знаю, почему ваш приемник перестает работать через некоторое время. Ваша программа должна быть очищена системой. Чтобы заставить его работать, вам нужно что-то сделать, чтобы ваше приложение не очищалось. Поэтому вам нужно создать сервис. В BOOT_COMPLETED запустите службу и в этом сервисном регистре передайте приемник для ACTION_HEADSET_PLUG. Это должно предотвратить очистку приложения.
Ваш код верен, но, насколько я знаю, вы не можете поместить фильтр HEADSET_PLUG в манифест. Вместо этого удалите получателя из манифеста и сделайте это программно, из какой-то части вашего приложения. Метод onCreate() вашего основного действия должен быть точным, например:
ReceiveBroadcast receiver=new ReceiveBroadcast();
registerReceiver(receiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG));