2013-10-10 4 views
2

Я внедрил службу Android (START_STICKY), которая начинается с загрузки устройства и работает в фоновом режиме. Функциональность этой услуги заключается в взаимодействии с SD-картой. Поскольку он работает непрерывно, он запускается с липкой батареей. Чтобы решить проблему с интенсивным потреблением батареи, я хотел начать эту услугу, когда пользователь использует устройство.Как запустить фоновое обслуживание, когда пользователь начинает использовать Android-устройство?

Идеальное начало/остановка на основе ACTION_SCREEN_ON & ACTION_SCREEN_OFF намерения.

Когда я проверил это обнаружил, что я не могу зарегистрировать ACTION_SCREEN_OFF & ACTION_SCREEN_ON в манифесте, так что я создал приемник вещания в моей службе, чтобы захватить ACTION_SCREEN_OFF & ACTION_SCREEN_ON.

Но, поскольку я не могу зарегистрироваться для намерений в манифесте, когда я останавливаю свое обслуживание на ACTION_SCREEN_OFF. Как я могу запустить его, когда экран возвращается?

Примечание: Как я уже говорил SCREEN_ON + SCREEN_OFF не может быть зарегистрирован в файле манифеста. Зарегистрировано как

// REGISTER RECEIVER THAT HANDLES SCREEN ON AND SCREEN OFF LOGIC 

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
filter.addAction(Intent.ACTION_SCREEN_OFF); 
broadcastReceiver = new TestReceiver(); 
registerReceiver(broadcastReceiver, filter); 

Поэтому, когда служба не работает, это намерение не срабатывает.

+0

Ну, в вашем BroadcastReceiver для SCREEN_ON + SCREEN_OFF, просто вперед их к службе через StartService с таким же действием. В сервисе вы можете проверить onStartCommand, какое действие имеет намерение, если это screen_on -> запустить службу, если это screen_off, служба уже должна быть запущена, поэтому вы ее отключите. – damian

+0

Как я уже говорил, SCREEN_ON + SCREEN_OFF не может быть зарегистрирован в файле манифеста. SO, когда сервис не запускается, он не будет вызван. – Sachin

+0

Аналогичный вопрос: http://stackoverflow.com/questions/9477922/android-broadcast-receiver-for-screen-on-and-screen-off, и ответ заключался в том, что вам нужно использовать долгосрочное обслуживание (липкое). – aleung

ответ

1

вы можете использовать BroadCastReciever для вызова службы на основе типа вещания

public class MyReceiver extends BroadcastReceiver { 

    public static boolean wasScreenOn = true; 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 

      // do whatever you need to do here 

     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
       // and do whatever you need to do here 

     } 
     else if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) 
     { 
      // and do whatever you need to do here 
     } 

    } 
+0

Как я уже говорил, SCREEN_ON + SCREEN_OFF не может быть зарегистрирован в файле манифеста. Он зарегистрирован как // РЕГИСТРАЦИОННЫЙ ПРИЕМНИК, ЧТО ОБРАЩАЕТ ЭКРАН И ВЫКЛЮЧАЕТ ЛОГИКУ. Фильтр IntentFilter = новый IntentFilter (Intent.ACTION_SCREEN_ON); filter.addAction (Intent.ACTION_SCREEN_OFF); broadcastReceiver = новый TestReceiver(); registerReceiver (broadcastReceiver, filter); Поэтому, когда служба не запущена, она начнется. – Sachin

+0

см. Я разрабатываю пользовательский экран блокировки, и я тоже должен обнаруживать состояние экрана, его работа для меня .. и я зарегистрировал приемник в манифесте с помощью: r4jiv007

+0

Да, вы правы. BOOT_COMPLETED может быть зарегистрирован в манифесте, и это работает.Но когда мы регистрируем SCREEN_ON & SCREEN_OFF в манифесте, вы не включаетесь в режим включения/выключения. можешь попробовать. Поэтому я не могу начать сервис, если он был убит системой Android. Я видел, что, несмотря на то, что он липкий, когда устройство находится в спящем режиме, его убивают и он не запускается снова. – Sachin

0

есть приемник вещания для ACTION_SCREEN_ON, ACTION_SCREEN_OFF и ACTION_USER_PRESENT.

onResume активности будет называться при активации ACTION_SCREEN_ON. Создайте обработчик и дождитесь ACTION_USER_PRESENT. Когда он уволен, реализуйте то, что вы хотите для своей деятельности.

Регистрация приемника, как показано ниже:

private void registBroadcastReceiver() { 
    final IntentFilter theFilter = new IntentFilter(); 
    /** System Defined Broadcast */ 
    theFilter.addAction(Intent.ACTION_SCREEN_ON); 
    theFilter.addAction(Intent.ACTION_SCREEN_OFF); 

    mPowerKeyReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String strAction = intent.getAction(); 

      if (strAction.equals(Intent.ACTION_SCREEN_OFF) || strAction.equals(Intent.ACTION_SCREEN_ON)) { 
       // > Your playground~! 
      } 
     } 
    }; 

    getApplicationContext().registerReceiver(mPowerKeyReceiver, theFilter); 
} 
+0

Как я уже говорил, это фоновая служба, а не активность. SO no onResume. – Sachin

+0

см. Мой отредактированный ответ –

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