Autore Topic: Bloccare l'arresto di un servizio  (Letto 1330 volte)

Offline Majestcx

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Ace, Next, S3 e Tablet Asus e il mitico OnePlus One *-*
  • Sistema operativo:
    Ubuntu 14.10, Windows 8.1
Bloccare l'arresto di un servizio
« il: 27 Settembre 2013, 15:51:42 CEST »
0
Ciao a tutti,

Ho creato un servizio che ogni 5 secondi mi va a leggere un file TxT su internet, e se c'è scritto per esempio "show" allora mostra una Notifica, e allo stesso modo se c'è scritto "Null", ora il mio problema è che dopo qualche minuto il processo del servizio viene arrestato.. e per evitare c'è ho messo che in onDestroy() si riapriva con un Intent, ma ho letto che quando vengono chiuse dal sistema il metodo onDestroy non viene richiamato.. Quindi come posso fare? Grazie.



Codice (Java): [Seleziona]
public class Events extends Service {
       
        @Override
        public int onStartCommand(Intent intent, int flags, int startId)
        {
       notifica notify = new notifica(this);
       notify.start();
           return startId;
        }
       
        @Override
        public IBinder onBind(Intent arg0) {
                // TODO Auto-generated method stub
                return null;
        }
       
        public class notifica extends Thread
        {
                SharedPreferences prefs;
                Context questo;
               
                public notifica(Context cont)
                {
                        questo = cont;
                }
               
                public void run()
                {
                        prefs = PreferenceManager.getDefaultSharedPreferences(questo);
                    final SharedPreferences.Editor editor = prefs.edit();
                        String last_live = prefs.getString("status", "null");
                        final int notificationID = (int)System.currentTimeMillis();
                        android.app.NotificationManager notificationManager = (android.app.NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); 
                        Intent intent = new Intent(questo, Live.class);
                        PendingIntent pIntent = PendingIntent.getActivity(questo, 0, intent, 0);
                       
                       
                                while(true)
                                {
                                        try
                                    {
                                        String live = download_String("http://sito.org/fdfd.txt");
                                        sleep(500);
                                        if(live.contains("show") && last_live.contains("show") == false)
                                        {
                                        last_live = live;
                                        Notification notifica = new NotificationCompat.Builder(questo)
                                .setContentTitle("title")
                                .setContentText("testo!")
                                .setSmallIcon(R.drawable.live_ico_notifica)
                                .setContentIntent(pIntent)
                                .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
                                .setVibrate(new long[] {1000, 1000, 1000, 1000, 1000 })
                                .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE)
                                .build();
                                       
                                        notificationManager.notify(notificationID, notifica);
                                        editor.putString("status", live);
                                        editor.commit();
                                        }
                                        else if(live.contains("null") && last_live.contains("null") == false)
                                        {
                                            last_live = live;
                                                Notification notifica = new NotificationCompat.Builder(questo)
                                        .setContentTitle("title")
                                        .setContentText("testo!")
                                        .setSmallIcon(R.drawable.live_ico_notifica)
                                        .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
                                        .setVibrate(new long[] {1000, 1000, 1000, 1000, 1000 })
                                        .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE)
                                        .build();
                                               
                                                notificationManager.notify(notificationID, notifica);
                                                editor.putString("status", live);
                                            editor.commit();
                                        }
                                       
                                       
                                        sleep(5000);
                                        }catch(Exception e)
                                        {
                                                Log.i("Errore", e.toString());
                                        }
                                }
                }
        }      
       
        public String download_String(String url)
        {
                String responseBody = "null";
                HttpClient httpclient = new DefaultHttpClient();
        try {
            HttpGet httpget = new HttpGet(url);
            Log.d("", "request " + httpget.getURI());
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            responseBody = httpclient.execute(httpget, responseHandler);
        } catch (ClientProtocolException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                } finally {
            httpclient.getConnectionManager().shutdown();
        }
        return responseBody;
        }
       
        @Override
        public void onDestroy()
        {
            super.onDestroy();
            Intent myIntent = new Intent(this, Events.class);
            this.startService(myIntent);
        }
}

Offline uglyicons

  • Utente junior
  • **
  • Post: 88
  • UglyIcons - Great Apps (perlomeno ci proviamo)
  • Respect: +3
    • Mostra profilo
    • La mia app: EML Reader FREE
  • Dispositivo Android:
    Huawei Honour
  • Play Store ID:
    UglyIcons
  • Sistema operativo:
    Win
Re:Bloccare l'arresto di un servizio
« Risposta #1 il: 27 Settembre 2013, 15:57:04 CEST »
0
Cosa ti dice nel LogCat ?

Quando ho un servizio se è startato ci pensa lui stesso a restartarlo...

(btw, un servizio che polla OGNI 5 SECONDI su internet mi sembra impegnativo, ti succhierà tutta la batteria :) )
EML Reader FREE
Apri file e allegati EML e MSG da qualsiasi fonte.
Download su Play Store!

Offline Majestcx

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Ace, Next, S3 e Tablet Asus e il mitico OnePlus One *-*
  • Sistema operativo:
    Ubuntu 14.10, Windows 8.1
Re:Bloccare l'arresto di un servizio
« Risposta #2 il: 27 Settembre 2013, 17:20:09 CEST »
0
Si, ma per esempio quello di  facebook (servizio) si riapre da solo anche quando viene arrestato dal sistema..

Offline uglyicons

  • Utente junior
  • **
  • Post: 88
  • UglyIcons - Great Apps (perlomeno ci proviamo)
  • Respect: +3
    • Mostra profilo
    • La mia app: EML Reader FREE
  • Dispositivo Android:
    Huawei Honour
  • Play Store ID:
    UglyIcons
  • Sistema operativo:
    Win
Re:Bloccare l'arresto di un servizio
« Risposta #3 il: 27 Settembre 2013, 17:30:03 CEST »
0
Appunto, dovrebbe comunque ripartire, per cui è strano che non riparta.

Hai il LogCat di riferimento ?
EML Reader FREE
Apri file e allegati EML e MSG da qualsiasi fonte.
Download su Play Store!

Offline Majestcx

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Ace, Next, S3 e Tablet Asus e il mitico OnePlus One *-*
  • Sistema operativo:
    Ubuntu 14.10, Windows 8.1
Re:Bloccare l'arresto di un servizio
« Risposta #4 il: 27 Settembre 2013, 17:41:18 CEST »
0
Appunto, dovrebbe comunque ripartire, per cui è strano che non riparta.

Hai il LogCat di riferimento ?

Ok.. ho sistemato alcune cose e ora sembra funzionare...

Un altra cosa... Siccome uso un loop "While(true)" ho letto che questo loop consuma molta CPU
Quindi secondo te e meglio far si che il servizio controlli e si (riavvii)/(lo chiudo e lo riapro con un Intent)..

Casomai per il riavvio del service al posto di finish() cosa devo usare?

Offline uglyicons

  • Utente junior
  • **
  • Post: 88
  • UglyIcons - Great Apps (perlomeno ci proviamo)
  • Respect: +3
    • Mostra profilo
    • La mia app: EML Reader FREE
  • Dispositivo Android:
    Huawei Honour
  • Play Store ID:
    UglyIcons
  • Sistema operativo:
    Win
Re:Bloccare l'arresto di un servizio
« Risposta #5 il: 27 Settembre 2013, 18:13:10 CEST »
0
Direi di usare un timer...
Android Timer within a service - Stack Overflow

Eviterei assolutamente un ciclo while...  ;)

EML Reader FREE
Apri file e allegati EML e MSG da qualsiasi fonte.
Download su Play Store!

Offline Majestcx

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Ace, Next, S3 e Tablet Asus e il mitico OnePlus One *-*
  • Sistema operativo:
    Ubuntu 14.10, Windows 8.1
Re:Bloccare l'arresto di un servizio
« Risposta #6 il: 27 Settembre 2013, 18:22:40 CEST »
0
Direi di usare un timer...
Android Timer within a service - Stack Overflow

Eviterei assolutamente un ciclo while...  ;)

Grazie :D

Lo provo subito

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Bloccare l'arresto di un servizio
« Risposta #7 il: 28 Settembre 2013, 09:20:39 CEST »
0
Direi di usare un timer...
Android Timer within a service - Stack Overflow

Eviterei assolutamente un ciclo while...  ;)

Mi permetto di dire che NON dovresti usare nemmeno un timer.
Il timer cmq brucia risorse ed è un processo attivo.

Dovresti usare un Alarm.
AlarmManager | Android Developers

Offline Majestcx

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Ace, Next, S3 e Tablet Asus e il mitico OnePlus One *-*
  • Sistema operativo:
    Ubuntu 14.10, Windows 8.1
Re:Bloccare l\\\\\\\'arresto di un servizio
« Risposta #8 il: 28 Settembre 2013, 09:26:55 CEST »
0
Mi permetto di dire che NON dovresti usare nemmeno un timer.
Il timer cmq brucia risorse ed è un processo attivo.

Dovresti usare un Alarm.
AlarmManager | Android Developers

Ok, ultima cosa.. Qualche volta il service si chiude e io credo che sia il sistema, per risparmiare RAM, ma per esempio Facebook non viene chiuso quindi... C'è mica un codice per alzare la priorità?
« Ultima modifica: 28 Settembre 2013, 10:52:28 CEST da Majestcx »

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Bloccare l\\\\\\\'arresto di un servizio
« Risposta #9 il: 28 Settembre 2013, 18:18:10 CEST »
+1
Ok, ultima cosa.. Qualche volta il service si chiude e io credo che sia il sistema, per risparmiare RAM, ma per esempio Facebook non viene chiuso quindi... C'è mica un codice per alzare la priorità?

Usando l'alarm eviti anche questi problemi, proprio perchè il tuo codice parte e finisce e non rimane in esecuzione.

Offline uglyicons

  • Utente junior
  • **
  • Post: 88
  • UglyIcons - Great Apps (perlomeno ci proviamo)
  • Respect: +3
    • Mostra profilo
    • La mia app: EML Reader FREE
  • Dispositivo Android:
    Huawei Honour
  • Play Store ID:
    UglyIcons
  • Sistema operativo:
    Win
Re:Bloccare l'arresto di un servizio
« Risposta #10 il: 29 Settembre 2013, 08:01:08 CEST »
0
Mi permetto di dire che NON dovresti usare nemmeno un timer.
Il timer cmq brucia risorse ed è un processo attivo.

Dovresti usare un Alarm.
AlarmManager | Android Developers

Giustissimo, hai perfettamente ragione.

Cmq conviene evitare di settarlo ogni 5 secondi, altrimenti  tanto vale usare il timer :D

EML Reader FREE
Apri file e allegati EML e MSG da qualsiasi fonte.
Download su Play Store!