Широковещательный приемник в службе, но намерение не попасть в службу после завершения процесса

У меня есть простой виджет, который выполняет некоторые вычисления после включения экрана, отображает их и очищает все поля после выключения экрана... У меня есть настройка приемника широковещательной передачи в моей службе, которая прослушивает ACTION_SCREEN_ON и ACTION_SCREEN_OFF.

Это работает отлично, пока телефон не переходит в спящий режим в течение длительного периода времени или если телефон интенсивно используется - как только это происходит, мой процесс виджета уничтожается (служба все еще работает, но процесс убивается) после это, когда экран гаснет и возвращается в мой виджет, не обновляется, поскольку намерение ACTION_SCREEN_ON не перехватывается моей службой :(

public class CDTservice extends Service {

  @Override
   public void onCreate() {


        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        m_receiver = new ScreenBroadcastReceiver();
        registerReceiver(m_receiver, filter);
        Log.d("Widgettool", "works");
    }



  @Override
   public int onStartCommand(Intent intent, int flags, int startId) {


start();
Toast.makeText(getBaseContext(), "SERVICE ON", Toast.LENGTH_SHORT).show();

return START_REDELIVER_INTENT;
    }


     @Override
     public void onDestroy() {
 stop();
      unregisterReceiver(m_receiver);
      }



     public void start()
       { 
RemoteViews View = new RemoteViews(this.getPackageName(), R.layout.main);   
updatewidgetclass x= new updatewidgetclass(this, View, widgetId);
x.start(); // does calculations and displays on widget
     }


      public void stop()
   {   
RemoteViews Viewclear = new RemoteViews(this.getPackageName(), R.layout.main);

updatewidgetclass y = new updatewidgetclass(this, Viewclear, widgetId);
y.stop(); // clears resources and stops

}


   private class ScreenBroadcastReceiver extends BroadcastReceiver {

     @Override
    public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
        Log.d("ON SCREEN ON", "might hang here");   
        start();


     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
       stop();

    }
    }

    }

иногда когда процесс виджета не востребован системой андроид виджет отлично работает сутками и отлично отображает значения ACTION_SCREEN_ON

проблема возникает, когда - я проверяю в настройках> приложения> работает - я вижу имя своего виджета, и он говорит, что 0 процессов и 1 служба

я предполагаю, что широковещательный прием происходит в основном процессе и, следовательно, он не получает его, когда процесс уничтожается.

У меня есть обходной путь для этого, но я действительно хотел бы решить эту проблему. Любая помощь приветствуется


person user1492955    schedule 23.05.2013    source источник
comment
img515.imageshack.us/img515/5281/screenshot2013052311325.png Скриншот запуска услуга   -  person user1492955    schedule 23.05.2013
comment
Связывать память со службой каждый момент дня, просто чтобы узнать, когда экран включается и выключается, враждебно пользователю. Наличие постоянно работающего сервиса — это антипаттерн в разработке Android. Пожалуйста, найдите какое-нибудь другое решение любой проблемы, которую, по вашему мнению, вы решаете.   -  person CommonsWare    schedule 23.05.2013
comment
если у меня есть широковещательный приемник в классе виджетов, то намерения для включения экрана никогда не доставляются в виджет   -  person user1492955    schedule 23.05.2013
comment
Правильный. Решение состоит в том, чтобы прекратить попытки принимать трансляции при выключенном и включенном экране. Они предназначены *для использования приложением переднего плана, а не виджетом приложения.   -  person CommonsWare    schedule 23.05.2013
comment
Спасибо CommonsWare, я пересмотрел и изменил свой дизайн. Но мне все еще любопытно, почему, если моя служба все еще работает, она не обнаруживает появление экрана? Дело в том, что процесс для виджета убивается, и, следовательно, служба не может получить трансляцию ?? :с   -  person user1492955    schedule 23.05.2013
comment
Я понятия не имею, извините.   -  person CommonsWare    schedule 23.05.2013


Ответы (1)


Я согласен с @CommonsWare в том, что постоянно запускать службу в bg только для того, чтобы определять, когда экран включается и выключается, - очень плохая идея. Вам действительно нужен ACTION_SCREEN_ON или будет достаточно ACTION_USER_PRESENT (телефон разблокирован)? Таким образом, вам вообще не нужен сервис, и вы можете просто определить получателя в манифесте.

Если вы действительно этого хотите, вы можете зарегистрировать свой сервис/ACTION_SCREEN_OFFприемник в своем ACTION_USER_PRESENT приемнике, чтобы служба работала только тогда, когда пользователь фактически использует устройство.

Я знаю, что это на самом деле не отвечает на ваш вопрос, но это действительно полезное решение вашей проблемы.

person dberm22    schedule 23.05.2013
comment
на самом деле я придумал новое решение своей проблемы, но после прочтения вашего ответа я попытался использовать ACTION_SCREEN_ON в своем виджете, но он не получает трансляцию в виджете. Чтобы убедиться, что мой код правильный, я просто поместил его в пустое приложение, чтобы поймать ACTION_SCREEN_ON и отобразить его в виде всплывающего уведомления. Он отлично работает в приложении, но не работает в виджете :s - person user1492955; 24.05.2013