BroadcastReceiver ACTION_SCREEN_ON\OFF

Ответить
bydirect
Сообщения: 70
Зарегистрирован: 11 июн 2014, 10:36

BroadcastReceiver ACTION_SCREEN_ON\OFF

Сообщение bydirect » 17 мар 2015, 16:24

Приветствую!
Помогите пожалуйста решить проблему с BroadcastReceiver. В моем приложении необходимо получать события о включении и выключении экрана.
Для этого я создал BroadcastReceiver
[syntax=java5]
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
Log.i("MyReceiver", "Screen ON!");
Toast toast = Toast.makeText(context.getApplicationContext(),
"Screen ON", Toast.LENGTH_SHORT);
toast.show();
} else {
Toast toast = Toast.makeText(context.getApplicationContext(),
"Screen OFF!", Toast.LENGTH_SHORT);
toast.show();
Log.i("MyReceiver", "Screen OFF!");
}
}
}[/syntax]
Данный код хорошо работает если запущено приложение, но как только стоит его закрыть, высыпается ошибка "Activity screenon_off.screenon_off.MainActivity has leaked IntentReceiver screenon_off.screenon_off.MyReceiver@41c57450 that was originally registered here. Are you missing a call to unregisterReceiver()?". В данных ошибках я не силен, подскажите что от меня хочет Android Studio, как можно это исправить и как сделать что бы сообщения показывались при закрытой активити?
Заранее спасибо!.

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: BroadcastReceiver ACTION_SCREEN_ON\OFF

Сообщение klblk » 18 мар 2015, 08:15

Activity не предназначена для фоновых задач. И я не могу представить задачу в которой было бы необходимо использовать Intent.ACTION_SCREEN_ON/Intent.ACTION_SCREEN_OFF в Activity, почему бы не обойтись стандартными методами onStart()/onStop()?
Как я понял не нравится системе то, что вы ресивер прицепляете (registerReceiver()), но нигде его не отцепляете (unregisterReceiver()).
Собственно если registerReceiver() делается в onCreate(), то в onDestroy() должен делаться unregisterReceiver().

bydirect
Сообщения: 70
Зарегистрирован: 11 июн 2014, 10:36

Re: BroadcastReceiver ACTION_SCREEN_ON\OFF

Сообщение bydirect » 18 мар 2015, 09:45

Мне нужно что бы при включении экрана выполнялся нужны мне код.

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: BroadcastReceiver ACTION_SCREEN_ON\OFF

Сообщение klblk » 18 мар 2015, 11:55

Если Activity активно (в данный момент на экране), то код можно выполнить в onStart().
Если нет и нужно чтобы код выполнялся независимо от состояния Activity:
1) Делать сервис, который будет крутиться в фоне и уже у него делаем registerReceiver()
2) Я не знаю можно ли так делать: зарегистрировать ресивер в контексте приложения (из Activity можно попробовать так: getApplicationContext().registerReceiver())

Хотя я могу что-то упускать.

bydirect
Сообщения: 70
Зарегистрирован: 11 июн 2014, 10:36

Re: BroadcastReceiver ACTION_SCREEN_ON\OFF

Сообщение bydirect » 18 мар 2015, 13:21

klblk писал(а):Если Activity активно (в данный момент на экране), то код можно выполнить в onStart().
Если нет и нужно чтобы код выполнялся независимо от состояния Activity:
1) Делать сервис, который будет крутиться в фоне и уже у него делаем registerReceiver()
2) Я не знаю можно ли так делать: зарегистрировать ресивер в контексте приложения (из Activity можно попробовать так: getApplicationContext().registerReceiver())

Хотя я могу что-то упускать.
Во всех мануалах написано, что если BroadcastReceiver зарегистрировать через манифест, а не в самом приложении, то система будет ему отсылать сообщения при наступлении события. Но на практике с закрытым приложением, мне ни чего не приходит(((

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: BroadcastReceiver ACTION_SCREEN_ON\OFF

Сообщение klblk » 18 мар 2015, 13:29

Зависит от ACTION. Некоторые в манифесте прописать не получится.
http://stackoverflow.com/a/1588267

bydirect
Сообщения: 70
Зарегистрирован: 11 июн 2014, 10:36

Re: BroadcastReceiver ACTION_SCREEN_ON\OFF

Сообщение bydirect » 18 мар 2015, 14:16

Печально(( Как же тогда еще можно определить, что человек использует устройство в данный момент времени?

bydirect
Сообщения: 70
Зарегистрирован: 11 июн 2014, 10:36

Re: BroadcastReceiver ACTION_SCREEN_ON\OFF

Сообщение bydirect » 19 мар 2015, 16:20

Решил проблему. Засунул BroadcastReceiver в Service. Все работает как часы! Только почему то при разблокировании экрана, пишет "Screen OFF!"

Ответить