2013-04-29 10 views
6

Ho un'applicazione con un servizio. Il servizio viene avviato dall'app nell'attività principale sul metodo di creazione. Il mio problema si verifica quando esco dall'applicazione: il servizio si arresta e talvolta si riavvia immediatamente, a volte si riavvia di recente. Ho provato nella versione 4.1.2 e nella versione 2.3.6. il servizio non è di nuovo disponibile nella versione 2.3.6. Il mio approccio è sbagliato? Tra la fermata e i tempi di riavvio, può arrivare la chiamata che deve essere bloccata. C'è un modo per non interrompere il servizio quando si esce dall'app? Nota: non riesco a utilizzare un servizio remoto.Il servizio Android si arresta quando esco dall'applicazione

ho aggiunto startForeground al servizio ma lo stesso problema. quando esco di applicazione del servizio arrestato e si riavvia la versione 2.3.3 anche io vedere notification.But phoneStateListener assume valore nullo Come posso garantire quando esco di applicazione, il servizio non si ferma

//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 private void () {

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

cambio la cui impostazione callstatelistener dal servizio per trasmettere come Dhawal Sodha consigliato ma in questo caso il blocco delle chiamate indesiderate ottenere lento. Penso che durante la trasmissione TelephonyManager inizializzi ogni chiamata. Trasmetti il ​​codice qui sotto. Quando utilizzo il servizio, quando si interrompe l'attività principale, il servizio viene arrestato nella versione 2.3.3. Qualche idea ? Broadcast o servizio? Come può rendere più veloce la trasmissione? ogni variabile e oggetto chiamante si inizializza nuovamente in broadcast.

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

si desidera bloccare il numero ??? quindi usa questo codice in Broadcast receive .. invece di avviare il servizio .. –

+0

Quando dici "stop di servizio", intendi che viene chiamato onDestroy() dopo aver terminato la tua attività? Inoltre, quando dici "exit application", intendi solo terminare l'attività? – SirKnigget

+0

sì finitura attività principale con System.exit (0); – user2331641

risposta

6

Stai avviando il servizio con startService? In tal caso, al termine dell'attività, il servizio non è associato a nulla e può essere arrestato dal sistema.

Se si desidera eseguire un servizio in background indipendentemente dalle attività, utilizzare startForeground e fornire una notifica costante.

vedere il riferimento di servizio: http://developer.android.com/reference/android/app/Service.html

UPDATE

finitura tua app con System.exit(0)? Ovviamente il tuo servizio si ferma, che uccide il tuo processo. Non dovresti mai uscire da un'applicazione come questa - solo l'attività finish().

+0

modifica l'impostazione where callstatelistener dal servizio alla trasmissione come consigliato da Dhawal Sodha, ma in questo caso il blocco delle chiamate indesiderate si rallenta. penso – user2331641

+0

grazie a SirKnigget. – user2331641

+0

Se la risposta ha risolto il problema, contrassegnarlo come corretto. – SirKnigget

7

aggiungere questo codice nel metodo

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; 

Non sarà ferma il servizio onStartCommand().

+0

Quando si interrompe l'applicazione, questo servizio interrompe anche la notifica ignorata dalla barra di notifica –

Problemi correlati