Autore Topic: Thread o Service? Quale scegliere per un servizio sempre attivo?  (Letto 3998 volte)

Offline Grifith

  • Utente junior
  • **
  • Post: 56
  • Respect: +1
    • Mostra profilo
    • La mia prima applicazione...
0
Buonasera.
Nella applicazione che sto facendo, avrei bisogno di creare un servizio perennemente attivo. Inizialmente avevo utilizzato un banalissimo Thread, che venisse stoppato soltanto in determinati casi e che funzionasse anche in background sia dell'applicazione che del telefono.

Inizialmente sembrava funzionare. Peccato, che si è venuto a scoprire che, dopo circa tre minuti, tale thread e credo anche tutta l'applicazione, veniva automaticamente stoppata.

Per cercare di realizzare questo servizio, mi è venuto in mente di utilizzare un Service... O meglio, ho letto che bisogna utilizzare un Service... Mi confermate questa ipotesi?

Inoltre, sto cercando di realizzarne uno, ma senza successo, utilizzando semplicemente come chiamante il Service, che richiama il Thread... Una cosa simile a http://www.anddev.it/index.php/topic,5283.msg31460.html#msg31460, ma senza successo... Non riesco a farlo partire.

Non è che esiste un modo semplice affinchè il Thread non mi venga buttato giù in automatico?
E' normale che da emulatore, questo non accada?


Grazie mille...

Disperatamente vostro!

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Thread o Service? Quale scegliere per un servizio sempre attivo?
« Risposta #1 il: 19 Gennaio 2012, 18:54:38 CET »
0
Citazione
E' normale che da emulatore, questo non accada?

Credo che il problema principale sia quando il device se ne va in sleep/standby mode...cioè spegne lo schermo e anche la CPU...quindi addio app in background...mentre l'emulatore rimane sempre accesso ! Si potrebbe usare un WakeLock per tenere "sveglio" il device durante l'esecuzione dell'app(bye bye batteria)...ma se l'app che vuoi fare deve girare sempre credo ci vogliano altre soluzioni...che al momento mi sfuggono :-P
« Ultima modifica: 19 Gennaio 2012, 18:57:10 CET da teskio »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Thread o Service? Quale scegliere per un servizio sempre attivo?
« Risposta #2 il: 19 Gennaio 2012, 19:16:44 CET »
0
Non è che esiste un modo semplice affinchè il Thread non mi venga buttato giù in automatico?
E' normale che da emulatore, questo non accada?

No, il componente che devi usare in questo caso è un Service al cui interno fai comunque partire un Thread.
Se hai particolari problemi posta un po' di codice ;)

Se vuoi/puoi dirci cosa devi fare in questo service possiamo magari consigliarti una soluzione più efficiente.

Offline Grifith

  • Utente junior
  • **
  • Post: 56
  • Respect: +1
    • Mostra profilo
    • La mia prima applicazione...
Re:Thread o Service? Quale scegliere per un servizio sempre attivo?
« Risposta #3 il: 19 Gennaio 2012, 19:50:03 CET »
0
No, il componente che devi usare in questo caso è un Service al cui interno fai comunque partire un Thread.
Se hai particolari problemi posta un po' di codice ;)

Se vuoi/puoi dirci cosa devi fare in questo service possiamo magari consigliarti una soluzione più efficiente.

Grazie per la risposta. Quasi sicuramente di problemi ne avrò. Avevo fatto una cosa molto simile al topic che avevo messo, ma senza successo. Il service nn partiva. Cmq, quello che devo fare nn è altro che una serie di connessioni verso un server. Sono tutte chiamate in get.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Thread o Service? Quale scegliere per un servizio sempre attivo?
« Risposta #4 il: 19 Gennaio 2012, 20:04:32 CET »
0

Cmq, quello che devo fare nn è altro che una serie di connessioni verso un server. Sono tutte chiamate in get.

Allora potrebbe tornarti utile un componente chiamato AlarmManager. Con quest'ultimo infatti poi schedulare l'esecuzione periodica di alcuni task (come ad esempio l'esecuzione di un Service) senza che quest'ultimo rimanga continuamente in esecuzione.

Offline Grifith

  • Utente junior
  • **
  • Post: 56
  • Respect: +1
    • Mostra profilo
    • La mia prima applicazione...
Re:Thread o Service? Quale scegliere per un servizio sempre attivo?
« Risposta #5 il: 19 Gennaio 2012, 20:12:21 CET »
0
Allora potrebbe tornarti utile un componente chiamato AlarmManager. Con quest'ultimo infatti poi schedulare l'esecuzione periodica di alcuni task (come ad esempio l'esecuzione di un Service) senza che quest'ultimo rimanga continuamente in esecuzione.

Grazie per il consiglio... Intanto, il problema principale è quello di farlo partire...

il mio Service è creato in questa maniera:
Codice (Java): [Seleziona]
package my.android.thread;

import android.app.Activity;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.telephony.TelephonyManager;
import my.android.Polling;
import my.android.Polling.MyHandler;

public class PollingService extends Service {
       
        PollingThread pt;
       

        @Override
        public IBinder onBind(Intent intent) {
                // TODO Auto-generated method stub
                return null;
        }
       
        /* (non-Javadoc)
         * @see android.app.Service#onStartCommand(android.content.Intent, int, int)
         */

        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
                // TODO Auto-generated method stub
                return super.onStartCommand(intent, flags, startId);
        }

       

        /* (non-Javadoc)
         * @see android.app.Service#onCreate()
         */

        @Override
        public void onCreate() {
                // TODO Auto-generated method stub
                super.onCreate();
                Polling p = new Polling();
                Polling.MyHandler handler = p.new MyHandler();
                TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                Context ct = getBaseContext();
               
                pt = new PollingThread(handler, true, true, tm, ct);
                pt.start();
               
        }

        /* (non-Javadoc)
         * @see android.app.Service#onDestroy()
         */

        @Override
        public void onDestroy() {
                // TODO Auto-generated method stub
                super.onDestroy();             
                pt.setStart(false);
                pt.setFullStop(true);
                pt.distruggi();
        }

}

Il service viene richiamato in una Activity chiamata Polling, in questo modo:
Codice (Java): [Seleziona]
...
public Intent pollingService; // variabile globale
...

pollingService = new Intent(this, PollingService.class);
startService(pollingService);

...

Premetto che nell'istruzione ci entra, nel senso che arriva in startService, ma non chiama assolutamente il Service che ho creato.

il Manifest contiene prima del tag di chiusura application la dicitura
Codice (XML): [Seleziona]
<service android:name="PollingService"></service>

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Thread o Service? Quale scegliere per un servizio sempre attivo?
« Risposta #6 il: 19 Gennaio 2012, 20:18:40 CET »
0
Il psosterei le istruzioni che hai messo nell'onCreate all'interno dell'onStartCommand e farei ritornare a quest'ultimo la costante START_STICKY. Vedi descrizione:
Service | Android Developers
Comunque hai provato a mettere qualche breakpoint o qualche log e vedere cosa succede? Il codice sembra giusto.

Offline Grifith

  • Utente junior
  • **
  • Post: 56
  • Respect: +1
    • Mostra profilo
    • La mia prima applicazione...
Re:Thread o Service? Quale scegliere per un servizio sempre attivo?
« Risposta #7 il: 19 Gennaio 2012, 20:23:05 CET »
0
Il psosterei le istruzioni che hai messo nell'onCreate all'interno dell'onStartCommand e farei ritornare a quest'ultimo la costante START_STICKY. Vedi descrizione:
Service | Android Developers
Comunque hai provato a mettere qualche breakpoint o qualche log e vedere cosa succede? Il codice sembra giusto.

Scoperto il motivo per cui non partiva... Era un problema di posizione... Il Service si trovava sotto un package nominato thread... Spostandolo dove sono anche le altre activity,sembra essere partito...Dandomi un nullpointer... Il che è cosa buona... Almeno per adesso...

Offline Grifith

  • Utente junior
  • **
  • Post: 56
  • Respect: +1
    • Mostra profilo
    • La mia prima applicazione...
Re:Thread o Service? Quale scegliere per un servizio sempre attivo?
« Risposta #8 il: 20 Gennaio 2012, 10:34:17 CET »
0
Come volevasi dimostrare, risolto un problema, ne sorge subito un altro...

Nel tentativo di recuperare dei dati dal server, nel momento in cui li ricevo e cerco di stamparli a video, ricevo un nullPointerException relativo a queste righe del Logcat:

Codice: [Seleziona]
01-20 09:23:48.818: E/AndroidRuntime(334):         at android.content.ContextWrapper.getResources(ContextWrapper.java:80)
01-20 09:23:48.818: E/AndroidRuntime(334):         at android.content.Context.getString(Context.java:182)
01-20 09:23:48.818: E/AndroidRuntime(334):         at axa.android.Polling$MyHandler.handleMessage(Polling.java:599)

Relativo all'ultima riga, vi dico che si tratta di una istruzione di questo genere:
Codice (Java): [Seleziona]
getString(R.string.polling_no_signal_intro);Riga presente nel xml relativo alle Stringhe....

Da che potrebbe dipendere una situazione del genere?

Inoltre, è possibile modificare una Activity in Service, in modo che si comporti similmente alla Activity stessa? Ovvero, impostando il contentView, ecc.. ?

Grazie

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Thread o Service? Quale scegliere per un servizio sempre attivo?
« Risposta #9 il: 20 Gennaio 2012, 10:57:27 CET »
0
Inoltre, è possibile modificare una Activity in Service, in modo che si comporti similmente alla Activity stessa? Ovvero, impostando il contentView, ecc.. ?

No, i service non hanno interfaccia grafica.
Per l'altro non lo so, bisognerebbe debuggare un po'.

Offline Grifith

  • Utente junior
  • **
  • Post: 56
  • Respect: +1
    • Mostra profilo
    • La mia prima applicazione...
Re:Thread o Service? Quale scegliere per un servizio sempre attivo?
« Risposta #10 il: 20 Gennaio 2012, 12:24:40 CET »
0
No, i service non hanno interfaccia grafica.
Per l'altro non lo so, bisognerebbe debuggare un po'.

Peccato... Sarebbe stato bello... Comunque alla fine ho risolto. Era un problema relativo all'Handler del thread...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Thread o Service? Quale scegliere per un servizio sempre attivo?
« Risposta #11 il: 20 Gennaio 2012, 12:30:56 CET »
0
Peccato... Sarebbe stato bello... Comunque alla fine ho risolto. Era un problema relativo all'Handler del thread...

Che senso avrebbe? Se ti serve interazione con l'utente usi un activity, se ti serve un componente per eseguire task in background (e quindi per definizione senza interazione) usi un service.

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Thread o Service? Quale scegliere per un servizio sempre attivo?
« Risposta #12 il: 20 Gennaio 2012, 13:09:00 CET »
0
Io avrei un'altra domanda... ma perché ti serve un thread sempre attivo?

Offline Grifith

  • Utente junior
  • **
  • Post: 56
  • Respect: +1
    • Mostra profilo
    • La mia prima applicazione...
Re:Thread o Service? Quale scegliere per un servizio sempre attivo?
« Risposta #13 il: 20 Gennaio 2012, 14:06:59 CET »
0
Io avrei un'altra domanda... ma perché ti serve un thread sempre attivo?

E' una sorta di monitoraggio dell'applicazione e per l'invio di alcune informazioni.

Che senso avrebbe? Se ti serve interazione con l'utente usi un activity, se ti serve un componente per eseguire task in background (e quindi per definizione senza interazione) usi un service.

In realtà, la parte in background serve anche da interazione con l'utente... Guarda, un bel casino... ;)

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Thread o Service? Quale scegliere per un servizio sempre attivo?
« Risposta #14 il: 20 Gennaio 2012, 14:26:51 CET »
0
E' una sorta di monitoraggio dell'applicazione e per l'invio di alcune informazioni.

Fai attenzione, perchè tenere un thread quasi-costantemente attivo esaurisce la batteria del dispositivo in qualche ora. Nel caso in cui questo monitoraggio avvenga sempre (24h/24h), cerca di diradarlo il più possibile e/o usa un AlarmManager per svegliarlo solo quando ti serve.

In realtà, la parte in background serve anche da interazione con l'utente... Guarda, un bel casino... ;)

Per l'interazione lanci una activity e hai tutto quello che ti serve.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store