2016-11-10 2 views
0

У меня есть служба (для обнаружения входящих и исходящих вызовов), которую пользователь может запустить и остановить в моем приложении; служба может запускаться также при перезапуске устройства.Поддерживайте Android-сервис, а не бодрствуйте

Теперь я работаю в ситуации, когда служба не «бодрствует», когда устройство спит; и когда вызов получен, служба еще не пробуждена для обработки этого входящего вызова.

Мой вопрос заключается в том, как сделать мое обслуживание осведомленным об этом состоянии, не заставляя его пользоваться wakelock?
Если wakelock - единственный способ решить эту проблему, то какая должна быть лучшая реализация для этого?

+0

Не заставляйте свою службу работать только для захвата событий вызова. Зарегистрируйте приемник и сделайте все, что хотите, в 'onReceive()'. –

ответ

0

добавить в манифесте:

<uses-permission android:name="android.permission.WAKE_LOCK"/> 

Сейчас в службе:

PowerManager powerManager; 
PowerManager.WakeLock wakeLock; 

@Override 
    public void onCreate() { 
     super.onCreate(); 
     powerManager = (PowerManager) getSystemService(POWER_SERVICE); 
     wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "NOTIFY"); 

    } 

теперь

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     wakeLock.acquire(); 
     handleSERVICE(intent); 
     return START_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     wakeLock.release(); 
    } 
+0

Это то, что я видел на первом месте, и задавался вопросом, является ли «PARTIAL_WAKE_LOCK» лучшим выбором как уровень wakelock, документация гласит: «Если вы выполняете частичную блокировку слежения, процессор будет продолжать работать независимо от любых таймаутов дисплея или состояние экрана и даже после того, как пользователь нажмет кнопку питания. Во всех остальных замках слежения процессор будет работать, но пользователь все равно может отключить устройство с помощью кнопки питания ». Я попробую это, и вы заметите спасибо. – Anas

+0

это необходимо, потому что, пока ваша работа не будет завершена, обслуживание не может остановиться. после выполнения отчетов о выпуске бодрствования. –

+0

Я на самом деле согласен с вами и не нашел ничего более подходящего, более того, у новых устройств есть датчики близости, которые выключают экран, когда мы берем телефон в уши; избегая каких-либо недоразумений, ваш ответ - это то, как я пойду, и проверит его вскоре после того, как я сплю себе.thank tou – Anas

1

вы можете добавить эти разрешения на ваш манифест, и сделать BroadcastReceiver для слушать для входящего вызова и внутреннего ресивера, вы должны начать свою услугу

<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> 

<!--This part is inside the application--> 
    <receiver android:name=".CallReceiver" > 
     <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 
     </intent-filter> 
    </receiver> 
+0

Я уже реализовал эти службы INSIDE, которые отслеживают входящие и исходящие вызовы без моего приложения, я скорее думал о подобном подходе, без результата, система (я думаю) обрабатывает полученный вызов как приоритет, служба загруженный впоследствии. – Anas

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