Куда поставить намерение? Java или манифест?

Что-то мне еще не ясно; Мне нужно следить за уровнем заряда батареи, и я написал в своей службе в onCreate следующие строки:

public void onCreate(){
   super.onCreate();
   mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
   new IntentFilter(Intent.ACTION_BATTERY_CHANGED);    
}

Затем в манифесте:

<receiver android:name=".ReceversAndServices.BatteryLevelReceiver">
  <intent-filter>
    <action android:name="android.intent.action.BATTERY_CHANGED" />
    <action android:name="android.intent.action.BOOT_COMPLETED" />
  </intent-filter>
</receiver>

Чего я не понимаю, так это .. Правильно ли писать намерение Intent.ACTION_BATTERY_CHANGED в java, а также android.intent.action.BATTERY_CHANGED в манифесте? Или нужен только один?


person David_D    schedule 21.08.2013    source источник
comment
Строка new IntentFilter(Intent.ACTION_BATTERY_CHANGED); бесполезна в вашем методе onCreate().   -  person Hugo Hideki Yamashita    schedule 21.08.2013


Ответы (3)


Всякий раз, когда вы планируете использовать Intent Filter, всегда сверяйтесь с Intent документацией. Если широковещательная рассылка не может быть обнаружена манифестным фильтром намерений, это обычно описывается в документации. Например, широковещательное действие BATTERY_CHANGED предоставляет следующую информацию:

Вы не можете получить это через компоненты, объявленные в манифестах, только явно зарегистрировавшись для этого с помощью Context.registerReceiver().

person A--C    schedule 21.08.2013
comment
Вы предлагаете оставить код Java, как я писал ранее, или мне нужно что-то изменить? - person David_D; 21.08.2013
comment
@David_D, вам придется фактически зарегистрировать BroadcastReceiver, все, что вы сделали на данный момент, объявлено IntentFilter. Дополнительные сведения см. в этом ответе SO. - person A--C; 21.08.2013
comment
Спасибо .. Но почему я должен отменить регистрацию приемника на Destroy? Должен ли я сделать это также, если это услуга? - person David_D; 21.08.2013
comment
@David_D Отмена регистрации позволяет избежать утечки BroadcastReceiver, которую покажет LogCat (хотя приложение не должно падать). Я бы посчитал хорошей практикой также отменить регистрацию в службе. - person A--C; 21.08.2013
comment
Считаете ли вы, что запись намерения в оба файла может привести к разрядке батареи? Потому что теперь, если уведомление активировано, немного жрёт батарею.. и это не лучшая вещь для приложения для экономии заряда батареи :) - person David_D; 21.08.2013
comment
@David_D В каком другом файле? Объявление манифеста бесполезно, так как система его проигнорирует. Я предлагаю вам протестировать вашу текущую реализацию, и если она неудовлетворительна, этот ответ SO предоставляет некоторые альтернативы, которые даже не используют BATTERY_CHANGED . - person A--C; 21.08.2013

Вам нужно только 1. Написание его в манифесте делает его активным, как только приложение будет установлено. Помещение его в код Java сделает его активным только тогда, когда запущена деятельность/служба, в которой он создан.

person Gabe Sechan    schedule 21.08.2013
comment
В данном случае это уведомление.. Думаете, лучше писать его только в java? Уведомление получает уровень заряда батареи, и это служба, поэтому она все еще работает, даже если приложение закрыто. - person David_D; 21.08.2013

Оба способа правильны. Вы можете писать либо в файле манифеста, либо в файле java.
Некоторые разрешения должны быть указаны в файле манифеста.

person tj's    schedule 21.08.2013