2013-05-29 2 views
13

Мне нужно, чтобы радиопередатчик работал все время после того, как приложение было запущено.Сохранять приемник вещания после закрытия приложения

Вот код, который регистрирует этот приемник в приложении

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
    filter.addAction(Intent.ACTION_SCREEN_OFF); 
    BroadcastReceiver mReceiver = new ScreenEventsReceiver(); 
    registerReceiver(mReceiver, filter); 

и код для приемника

public class ScreenEventsReceiver extends BroadcastReceiver { 
    public static boolean wasScreenOn = true; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      wasScreenOn = false; 
      Log.d("ScreenEventReceiver", "ON"); 
     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      wasScreenOn = true; 
      Log.d("ScreenEventReceiver", "ON"); 
     } 
    } 
} 
+0

Возможно, вы захотите создать [сервис] (https://developer.android.com/reference/android/app/Service.html) –

+0

Но как насчет получения событий? –

+1

Вам действительно нужно отслеживать события включения/выключения экрана? Причина, по которой они заставляют вас регистрировать приемник не в манифесте, заключается в том, что они не хотят, чтобы люди всегда следили за этими событиями и замедляли работу устройства. – natez0r

ответ

17

Вы можете использовать услугу

В главном запуске приложения/остановки службы

Intent service = new Intent(context, MyService.class); 
context.startService(service); 
... 
Intent service = new Intent(context, MyService.class); 
context.stopService(service); 

служба

public class MyService extends Service 
{ 
private static BroadcastReceiver m_ScreenOffReceiver; 

@Override 
public IBinder onBind(Intent arg0) 
{ 
    return null; 
} 

@Override 
public void onCreate() 
{ 
    registerScreenOffReceiver(); 
} 

@Override 
public void onDestroy() 
{ 
    unregisterReceiver(m_ScreenOffReceiver); 
    m_ScreenOffReceiver = null; 
} 

private void registerScreenOffReceiver() 
{ 
    m_ScreenOffReceiver = new BroadcastReceiver() 
    { 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
    Log.d(TAG, "ACTION_SCREEN_OFF"); 
    // do something, e.g. send Intent to main app 
    } 
    }; 
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); 
    registerReceiver(m_ScreenOffReceiver, filter); 
} 
} 
+0

Это должно быть принято как ответ. – Talha

0

Вы можете запустить службу, которая выполняется на переднем плане. Это единственный способ гарантировать (в основном), что ваше приложение получит события. По-прежнему существует вероятность того, что ваше обслуживание переднего плана может быть убито во время сумасшедшего давления памяти из ОС (так что это не безупречно). Если вы запустите службу на переднем плане, пользователь увидит постоянное уведомление, чтобы знать, что он всегда работает.

Итак, мораль этой истории, действительно ли вам нужно постоянно следить за событиями на экране? Причина, по которой они заставляют вас регистрировать приемник не в манифесте, заключается в том, что они не хотят, чтобы люди всегда следили за этими событиями и замедляли работу устройства. Что вы пытаетесь достичь?

5

Если вы объявляете BroadcastReceiver в манифесте, он всегда будет активным и назвать, даже если приложение закрыто/остановлено

+5

SCREEN_ON и SCREEN_OFF не могут быть объявлены в файле манифеста. – alfoks

+0

@alfoks: почему SCREEN_ON и SCREEN_OFF не могут быть объявлены в AndroidManifest? Можете ли вы объяснить – Kushal

+0

@ Kushal Именно так они решили реализовать его. Я не помню оправдания за этим. – alfoks

0

Будьте осторожны, если вы используете Android 4.4.x, как есть ошибка, которая убивает фоновые услуги при закрытии приложения. Я тестировал свое приложение в Android 4.4.2, и у меня была такая же проблема. Здесь есть подробное объяснение:

http://www.androidpolice.com/2014/03/07/bug-watch-stopping-apps-on-android-4-4-2-can-silently-kill-related-background-services-a-fix-is-on-the-way/

0

Вы не можете получить некоторые широковещательные события через компоненту, заявленную в манифесте.

Эти события

  • ACTION_BATTERY_CHANGED
  • ACTION_CONFIGURATION_CHANGED
  • ACTION_SCREEN_OFF (Вы играете с этим событием)
  • ACTION_SCREEN_ON (Вы играете с этим событием)
  • ACTION_TIME_TICK

Ссылка https://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_ON

Так что в ваших конкретных событий, вам придется создать службу & вы должны зарегистрировать ваше мероприятие явно службы OnCreate() с с Context.registerReceiver().

Для других событий, записи в манифесте достаточно.

Смежные вопросы