2013-09-11 1 views
0

Я написал приложение-контакт-приложение с BroadcastReceiver (для состояний телефона), которое уведомляет пользователя о каждом пропущенном вызове с помощью WindowManager (похоже на напоминания в приложениях типа " Any.DO "). проблема в том, что это работает только до тех пор, пока мое приложение работает, как только я его закрываю, это уведомление, похоже, отключено. но пользователь должен получить четкое сообщение о каждом пропущенном вызове (включая спектральную функцию обработки этого пропущенного вызова) также, когда приложение неактивно.уведомление о пропущенных звонках, когда приложение не активно

это мой приемник

public class CallReceiver extends BroadcastReceiver { 

private static String lastState = TelephonyManager.EXTRA_STATE_IDLE; 

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

и это часть AndroidManifest для него

<receiver android:name="addressbook.CallReceiver" > 
     <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
     </intent-filter> 
    </receiver> 

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

это часть в AndroidManifest

<service 
     android:name="addressbook.ContentObserverService" 
     android:enabled="true"/> 

и это место, где я пытаюсь запустить эту службу в AddressBook.java

startService(new Intent(getApplicationContext(), ContentObserverService.class)); 

public class ContentObserverService extends Service { 

private Observer observer; 

public void onCreate() { 
    super.onCreate(); 
    D.d("observer created"); 
    Handler handler = new Handler(); 
    observer = new Observer(handler); 
    getContentResolver().registerContentObserver(Calls.CONTENT_URI, true, observer); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    D.d("onStartCommand"); 
    super.onStartCommand(intent, flags, startId); 
    return Service.START_STICKY; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    getContentResolver().unregisterContentObserver(observer); 
} 

но ни OnCreate, ни onStartCommand метод получает и я не получаю никаких ошибок или предупреждений.

так у меня есть два вопроса:

  1. является услуга правильным решением моей проблемы, или есть лучшее решение существующих
  2. если услуга является правильным решением, почему она не запускается?

РЕДАКТИРОВАТЬ: странная вещь заключается в том, что solutin с транслятором всегда работал на эмуляторе (даже когда мое приложение закрывается). проблема возникает только тогда, когда я получаю звонок на мой настоящий мобильный телефон.

ответ

1

Выполните следующие действия,

1) Зарегистрируйте приемник PhoneStateChange. Tutorial for BroadCast receiver

2) проверьте, не пропущен звонок.

3) если это был пропущенный звонок, запустите намерениеУслуги, чтобы показать уведомление. Tutorial for intentService

Редактировать: - Регистрация приемника в манифесте, чтобы он мог работать, даже если приложение не открывается.

1) создать независимый класс (без внутреннего класса) расширяет его с помощью широковещательного приемника. see in detail here

2) вам необходимо добавить приемник в файл AndroidManifest.как показано ниже

<receiver android:name="MyPhoneReceiver" > // this is name of your receiver class 
      <intent-filter> 
       <action android:name="android.intent.action.PHONE_STATE" > 
       </action> 
      </intent-filter> 
     </receiver> 

3) принять соответствующее разрешение, один

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

, и он будет работать, даже ваше приложение закрыто

+0

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

+0

проверить мой отредактированный ответ – AAnkit

+0

спасибо, но это то, что я сделал. и он работает только тогда, когда приложение не закрыто. – richard