2014-11-21 1 views
1

В моем приложении я использую BroadcastReceiver для отслеживания состояния телефона.Android: запустите службу, когда мое приложение не используется

В TelephonyManager имеется 3 состояния.

  1. EXTRA_STATE_IDLE
  2. EXTRA_STATE_OFFHOOK
  3. EXTRA_STATE_RINGING

В моем случае я хочу, чтобы показать простой пользовательский интерфейс, который показывает некоторые подробности о вызывающем, когда телефон звонит, и я хочу, чтобы закрыть, что ui, когда вызов, на который посетил пользователь, или вызов закончился.

Я звоню на службу, когда состояние телефона звонит. Если мое приложение используется, я могу видеть свою часть ui во время звонка телефона. Если мое приложение не используется, я не могу видеть часть ui.

enter image description here

Я проверил в моем фоне. Служба не работает. Я думаю, что моя служба работает только тогда, когда мое приложение используется, и оно не работает, когда мое приложение не используется.

Чтобы преодолеть это, что мне следует делать?

Это мой код.

@Override 
public void onReceive(Context context, Intent intent) { 
LoginActivity.login.finish(); 
MainActivity.main.finish(); 
telephonyRegister(context,intent); 
} 
public void telephonyRegister(final Context context, Intent intent) 
{ 
TelephonyManager telephony = (TelephonyManager)  context.getSystemService(Context.TELEPHONY_SERVICE); 
String imeiSIM1= telephony.getDeviceId(); 
System.out.println("IMEI NUMBER"+imeiSIM1);       
ctx=context; 
if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
     TelephonyManager.EXTRA_STATE_IDLE)) { 
    try 
    { 
    ProjectDailogActivity.projdialog.finish(); 
    }catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
    } 
else if(intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
     TelephonyManager.EXTRA_STATE_OFFHOOK)) 
{ 
    try{ 
     ProjectDailogActivity.projdialog.finish(); 
     }catch(Exception e) 
     { 
      e.printStackTrace(); 
     }  
} 
else if(intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
     TelephonyManager.EXTRA_STATE_RINGING)){ 
    phoneNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 
    isringing=true; 
       Intent intent11 = new Intent(ctx,ProjectDailogActivity.class); 
       intent11.putExtra("incoming_number",phoneNumber); 
       intent11.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       ctx.startActivity(intent11); 

} 

} 

Manifest.xml

<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<receiver android:name="com.domyhome.broadcastreceiver.IncomingCallInterceptor" > 
     <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
     </intent-filter> 
    </receiver> 

я получил окно, как TrueCaller.

Только значения, о которых я упомянул, являются по умолчанию.

Но это же окно не появляется, когда мое приложение не используется.

Пожалуйста, дайте мне представление.

ответ

0

, поэтому андроид разработчики изобрели BroadcastReciever - это позволяет подключить ваш код в качестве службы в ответ на системные события (например, загрузки, режим полета, и т.д.)

Vogella охватывает очень хорошо: http://www.vogella.com/tutorials/AndroidBroadcastReceiver/article.html

и для вашей ситуации (отправить команды в ответ на состояние телефона), вы также можете использовать эту статью, которая обеспечит полностью рабочий пример: http://androidexample.com/Incomming_Phone_Call_Broadcast_Receiver__-_Android_Example/index.php?view=article_discription&aid=61&aaid=86

статья HIGHTLIGHTS:

<!-- Manifest.xml --> 
    <receiver android:name=".IncomingCall"> 
      <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
      </intent-filter> 
    </receiver> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> 

и в Java - добавить эти классы

//your Listener class: 
    private class MyPhoneStateListener extends PhoneStateListener 
    { 
     public void onCallStateChanged(int state, String incomingNumber) 
     { 
      // state = 1 means when phone is ringing 
      if (state == 1) 
      { 
       // do something 
      } 
     } 
    } 

    //Reciever class: 
    public class IncomingCall extends BroadcastReceiver 
    { 
     public void onReceive(Context context, Intent intent) 
     { 
      // TELEPHONY MANAGER class object to register one listner 
      TelephonyManager tmgr = (TelephonyManager) context 
        .getSystemService(Context.TELEPHONY_SERVICE); 

      //Create Listner 
      MyPhoneStateListener PhoneListener = new MyPhoneStateListener(); 

      // Register listener for LISTEN_CALL_STATE 
      tmgr.listen(PhoneListener, PhoneStateListener.LISTEN_CALL_STATE); 
     } 
    } 
0

Не нужно запускать его в службе только в xml вашего приложения в секции приемника, используя действие телефонного звонка, и в вашем приеме реализуйте свой интерфейс. и у вас есть другой приемник для вашего приложения, чтобы слушать, когда телефон вырезается.

+0

На самом деле это приложение похоже на TrueCaller. Поэтому он всегда должен работать на фоне. Я вижу интерфейс, когда мое приложение не используется. Я также пробовал с сервисом и без обслуживания (просто прямо называемый актив из состояния звонка). Но я хочу показать пользовательский интерфейс, когда мое приложение также не используется? –

+0

Вы можете достичь того, что вы просите по вышеуказанному подходу. Вы можете определить startactivity (намерение (из вашего broadcastreciever – therealprashant

+0

). Пожалуйста, проверьте мой вопрос. Я обновил. –

0
@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // TODO Auto-generated method stub 
    Log.e("onStartCommand", "onStartCommand"); 
    return Service.START_STICKY; 
} 

http://developer.android.com/reference/android/app/Service.html

+0

Спасибо Deepak. Пожалуйста, проверьте мой обновленный вопрос. –

+0

вам нужно использовать концепцию bindservice. – deepak825

+0

public boolean bindService (Intent service, ServiceConnection conn, int flags) { return mBase.bindService (service, conn, flags); } – deepak825

0

Использование AlarmManager активировать услугу по истечении определенного времени и остановки службы, а также убить AlarmManager когда пришел вызов.

0

попробовать, как это,

AlarmManager am = (AlarmManager) context.getSystemService(context.ALARM_SERVICE); 
Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); 
intent.putExtra(ONE_TIME, Boolean.FALSE); 

PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 5 , pi); 

он будет повторять, пока вы вручную не остановить его ... может это поможет ...