2013-04-29 18 views
6

Mam aplikację z usługą. Usługa jest uruchamiana przez aplikację w głównym działaniu w metodzie tworzenia. Mój problem występuje, gdy wychodzę z aplikacji: usługa zatrzymuje się, a czasami restartuje natychmiast, czasami restartuje się ostatnio. Testowałem w wersji 4.1.2 i wersji 2.3.6. usługa nie działa ponownie w wersji 2.3.6. Czy moje podejście jest złe? Pomiędzy czasem zatrzymania i restartu, połączenie, które musi zostać zablokowane, może nadejść. Czy istnieje sposób, aby nie zatrzymać usługi po wyjściu z aplikacji? Uwaga: Nie mogę korzystać z usługi zdalnej.Usługa Androida zatrzymuje się po wyjściu z aplikacji

Dodałem startForeground do serwisu, ale ten sam problem. kiedy zamknąć aplikację usługa zatrzymana, a nie ponowne uruchomienie wersji 2.3.3 nawet widzę notification.But phoneStateListener przyjmuje wartość zerową Skąd mogę mieć pewność, kiedy zamknąć aplikację, usługa nie zatrzymuje

//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) 
     { 

     } 
    } 

private void 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); 
} 

zmienić ustawienie callstatelistener gdzie ze służby nadawać jako Dhawal Sodha poradził, ale w tym blokowanie niechcianych połączeń dostać powolne sprawy. Myślę, że w trakcie transmisji TelephonyManager inicjuje każde połączenie. Kod transmisji poniżej. Kiedy korzystam z usługi, po wyjściu z głównego działania usługa została zatrzymana w wersji 2.3.3. Dowolny pomysł ? Nadawanie lub usługa? Jak przyspieszyć transmisję? wszystkie zmienne wywołujące i obiekt inicjują ponownie w emisji.

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

Chcesz zablokować numer ??? to po prostu użyj tego kodu w wiadomości Odbieranie .. zamiast usługi startowej. –

+0

Kiedy mówisz "usługi zatrzymuje się", masz na myśli, że jego onDestroy() jest wywoływana po zakończeniu swojej działalności? Ponadto, kiedy mówisz "aplikacja wyjściowa", masz na myśli właśnie ukończenie działalności? – SirKnigget

+0

yes kończenie głównej czynności za pomocą System.exit (0); – user2331641

Odpowiedz

6

Czy rozpoczynasz korzystanie z usługi pod numerem startService? Jeśli tak, po zakończeniu aktywności usługa nie jest niczym związana i może zostać zatrzymana przez system.

Jeśli chcesz uruchomić usługę w tle bez względu na swoją działalność, użyj startForeground i wprowadź stałe powiadomienie.

Zobacz odniesienie Usługa: http://developer.android.com/reference/android/app/Service.html

UPDATE

wykończeniowe swoją aplikację z System.exit(0)? Oczywiście twoja usługa przestaje działać, co zabija twój proces. Nigdy nie należy opuszczać takiej aplikacji - tylko finish().

+0

Zmieniam miejsce ustawienia callstatelistener z usługi na broadcast, tak jak doradził Dhawal Sodha, ale w takim przypadku blokowanie niechcianych połączeń jest powolne. myślę, że – user2331641

+0

dziękuję SirKnigget. – user2331641

+0

Jeśli odpowiedź rozwiązała Twój problem, oznacz go jako prawidłowy. – SirKnigget

7

Dodaj ten kod w swoim sposobie

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; 

nie będzie zatrzymuje usługę onStartCommand().

+0

Po zabiciu aplikacji ta usługa się zatrzymuje, a powiadomienie jest usuwane z paska powiadomień –

Powiązane problemy