BroadcastReceiver ACTION_SCREEN_ON\OFF
BroadcastReceiver ACTION_SCREEN_ON\OFF
Приветствую!
Помогите пожалуйста решить проблему с 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, как можно это исправить и как сделать что бы сообщения показывались при закрытой активити?
Заранее спасибо!.
Помогите пожалуйста решить проблему с 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, как можно это исправить и как сделать что бы сообщения показывались при закрытой активити?
Заранее спасибо!.
Re: BroadcastReceiver ACTION_SCREEN_ON\OFF
Activity не предназначена для фоновых задач. И я не могу представить задачу в которой было бы необходимо использовать Intent.ACTION_SCREEN_ON/Intent.ACTION_SCREEN_OFF в Activity, почему бы не обойтись стандартными методами onStart()/onStop()?
Как я понял не нравится системе то, что вы ресивер прицепляете (registerReceiver()), но нигде его не отцепляете (unregisterReceiver()).
Собственно если registerReceiver() делается в onCreate(), то в onDestroy() должен делаться unregisterReceiver().
Как я понял не нравится системе то, что вы ресивер прицепляете (registerReceiver()), но нигде его не отцепляете (unregisterReceiver()).
Собственно если registerReceiver() делается в onCreate(), то в onDestroy() должен делаться unregisterReceiver().
Re: BroadcastReceiver ACTION_SCREEN_ON\OFF
Мне нужно что бы при включении экрана выполнялся нужны мне код.
Re: BroadcastReceiver ACTION_SCREEN_ON\OFF
Если Activity активно (в данный момент на экране), то код можно выполнить в onStart().
Если нет и нужно чтобы код выполнялся независимо от состояния Activity:
1) Делать сервис, который будет крутиться в фоне и уже у него делаем registerReceiver()
2) Я не знаю можно ли так делать: зарегистрировать ресивер в контексте приложения (из Activity можно попробовать так: getApplicationContext().registerReceiver())
Хотя я могу что-то упускать.
Если нет и нужно чтобы код выполнялся независимо от состояния Activity:
1) Делать сервис, который будет крутиться в фоне и уже у него делаем registerReceiver()
2) Я не знаю можно ли так делать: зарегистрировать ресивер в контексте приложения (из Activity можно попробовать так: getApplicationContext().registerReceiver())
Хотя я могу что-то упускать.
Re: BroadcastReceiver ACTION_SCREEN_ON\OFF
Во всех мануалах написано, что если BroadcastReceiver зарегистрировать через манифест, а не в самом приложении, то система будет ему отсылать сообщения при наступлении события. Но на практике с закрытым приложением, мне ни чего не приходит(((klblk писал(а):Если Activity активно (в данный момент на экране), то код можно выполнить в onStart().
Если нет и нужно чтобы код выполнялся независимо от состояния Activity:
1) Делать сервис, который будет крутиться в фоне и уже у него делаем registerReceiver()
2) Я не знаю можно ли так делать: зарегистрировать ресивер в контексте приложения (из Activity можно попробовать так: getApplicationContext().registerReceiver())
Хотя я могу что-то упускать.
Re: BroadcastReceiver ACTION_SCREEN_ON\OFF
Зависит от ACTION. Некоторые в манифесте прописать не получится.
http://stackoverflow.com/a/1588267
http://stackoverflow.com/a/1588267
Re: BroadcastReceiver ACTION_SCREEN_ON\OFF
Печально(( Как же тогда еще можно определить, что человек использует устройство в данный момент времени?
Re: BroadcastReceiver ACTION_SCREEN_ON\OFF
Решил проблему. Засунул BroadcastReceiver в Service. Все работает как часы! Только почему то при разблокировании экрана, пишет "Screen OFF!"