2013-04-29 3 views
6

У меня есть приложение с сервисом. Служба запускается приложением в основной деятельности по методу создания. Моя проблема возникает, когда я выхожу из приложения: служба останавливается и иногда перезапускается немедленно, иногда перезапускается в последнее время. Я тестировал версию 4.1.2 и версию 2.3.6. служба не возвращается в версии 2.3.6. Является ли мой подход неправильным? Между временем остановки и перезапуска может наступить вызов, который должен заблокирован. Есть ли способ не остановить службу при выходе из приложения? Примечание: я не могу использовать удаленный сервис.Служба Android останавливается при выходе из приложения

Я добавил startForeground для обслуживания, но та же проблема. когда я выйти из приложения служба остановлена ​​и не перезапускать версии 2.3.3, даже я вижу notification.But phoneStateListener принимает нулевое значение Как я могу гарантировать, когда я выйти из приложения, служба не останавливается

//application main metod 
@Override 
protected void onCreate(Bundle savedInstanceState) {    
//..... 

    startService(new Intent(getApplicationContext(), MyPhoneStateListener.class)); 
} 




@Override 
public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    setCallListener();  
    setNoti(); 
    return START_STICKY; 
} 

private void setCallListener() 
{ 
     try 
     { 
      if (phoneStateListener==null) 
      { 

       phoneStateListener = new StateListener(); 
       telephonymanager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
       telephonymanager.listen(phoneStateListener,PhoneStateListener.LISTEN_CALL_STATE); 
      } 
     } 
     catch(Exception ex) 
     { 

     } 
    } 

собственной недействительным setNoti () {

Notification notification= new Notification(R.drawable.ic_launcher, getResources().getString(R.string.app_name), System.currentTimeMillis()); 

    Intent main = new Intent(this, MainActivity.class); 

    main.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, main, PendingIntent.FLAG_UPDATE_CURRENT); 

    notification.setLatestEventInfo(this, getResources().getString(R.string.app_name), getResources().getStringArray(R.array.blockstate)[Sabitler.ShieldState].toString(), pendingIntent); 

    notification.flags |= Notification.FLAG_FOREGROUND_SERVICE | Notification.FLAG_NO_CLEAR; 

    startForeground(123456, notification); 
} 

я изменить, где установка callstatelistener от службы вещать в Dhawal Sodha рекомендуется, но в этом случае блокировки нежелательных вызовов получить медленно. Я думаю, что на трансляции TelephonyManager инициализирует каждый вызов. Код трансляции ниже. Когда я пользуюсь услугой, , когда основное действие завершено, остановлено в версии 2.3.3. Есть идеи ? Трансляция или услуга? Как сделать трансляцию быстрее? все вызывающие переменные и объект снова инициализируются в трансляции.

public class PhoneStateBroadcastReceiver extends BroadcastReceiver{ 

    MyCustomStateListener myCustomStateListener; 
    TelephonyManager telephonymanager; 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     try 
     { 
      //Log.e("receiver1",String.valueOf(System.currentTimeMillis())); 

      telephonymanager = (TelephonyManager) context.getSystemService(context.TELEPHONY_SERVICE); 
      myCustomStateListener = new MyCustomStateListener(context,telephonymanager); 
      telephonymanager.listen(myCustomStateListener, PhoneStateListener.LISTEN_CALL_STATE); 
      //Log.e("receiver2",String.valueOf(System.currentTimeMillis())); 
      telephonymanager.listen(myCustomStateListener, PhoneStateListener.LISTEN_NONE); 
     } 
     catch(Exception ex) 
     { 
      Toast.makeText(context,"setCallListener:"+ex.toString(), Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 
+0

Вы хотите заблокировать номер ??? то просто используйте этот код в Broadcast receive .. вместо запуска службы. –

+0

Когда вы говорите «остановки обслуживания», вы имеете в виду, что его onDestroy() вызывается после завершения вашей активности? Кроме того, когда вы говорите «выход из приложения», вы имеете в виду только закончить деятельность? – SirKnigget

+0

есть отделка основной деятельности с помощью System.exit (0); – user2331641

ответ

6

Вы начинаете услугу с startService? Если это так, когда вы завершаете свою деятельность, служба не привязана ни к чему и может быть остановлена ​​системой.

Если вы хотите запустить фоновое обслуживание независимо от ваших действий, используйте startForeground и предоставьте постоянное уведомление.

См справочной службы: http://developer.android.com/reference/android/app/Service.html

UPDATE

Finishing приложение с System.exit(0)? Конечно, ваше обслуживание прекращается, что убивает ваш процесс. Вы никогда не должны выходить из приложения - просто finish() ваша деятельность.

+0

Я меняю настройки, которые устанавливают callstatelistener из службы для трансляции, как сообщил Dhawal Sodha, но в этом случае блокировка нежелательного вызова замедляется. Я думаю, – user2331641

+0

спасибо SirKnigget. – user2331641

+0

Если ответ решил вашу проблему, отметьте его как правильную. – SirKnigget

7

Добавьте этот код в методе onStartCommand()

showToast("onStart"); 

    Intent intent = new Intent(this, NotStickyActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); 

    Notification noti = new Notification.Builder(getApplicationContext()) 
       .setContentTitle("Pratikk") 
       .setContentText("Subject") 
       .setSmallIcon(R.drawable.ic_launcher) 
       .setContentIntent(pendingIntent) 
       .build(); 

    startForeground(1234, noti);  

    return Service.START_STICKY; 

Это будет не останавливает вашу службу.

+0

При удалении приложения эта служба останавливает также уведомление, отклоненное из панели уведомлений –

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