Autore Topic: Service Start On Boot, Senza uso Activity  (Letto 1281 volte)

Offline auron86

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Service Start On Boot, Senza uso Activity
« il: 31 Agosto 2012, 11:53:44 CEST »
0
Salve, vi espongo il mio problema.

ho scritto un piccolo programmino che controlla lo stato del modulo WIFI se questo è attivo, ma senza essere agganciato a un router lo disattiva per risparmiare la batteria.
Il servizio deve andare in esecuzione ogni 30 minuti.
Fino a qui tutto bene, il problema che ho avviene quando questo servizio deve essere avviato al boot.

Codice Service

Codice (Java): [Seleziona]
public class ServicesEnergy extends Service implements Observer{
        ControlService ts;
        GestioneWifi gwf;
       
        @Override
        public IBinder onBind(Intent intent) {      
                return null;
        }
       
        @Override
        public void onCreate() {
                super.onCreate();
        }
       
       
        public int onStartCommand (Intent intent, int flags, int startId){
                super.onStartCommand(intent, flags, startId);
                Toast.makeText(getBaseContext(), "Gestore WiFi Avviato", Toast.LENGTH_SHORT).show();
                //Servizio continua a funzionare fino a una chiamata stopservice();
                ts=ControlService.getInstance();
                // aggiungiamo la nostra "View" come osservatore del modello dati
                ts.addObserver(this);
        gwf= new GestioneWifi();
        gwf.Handlers();
                return START_STICKY;
    }

        public void update(Observable observable, Object data) {
                if(observable instanceof ControlService){
                        // in quanto potremmo avere piu modelli dati
            // verifichiamo su quale modello è avvenuto un cambiamento dei dati
            // prima di effettuare il cast
            ControlService ts= (ControlService)observable;
            gestioneWifi();
            Toast.makeText(getBaseContext(), ts.getText(), Toast.LENGTH_SHORT).show();
                }
        }
       
        public void gestioneWifi(){
                //Tramite le API di android controllo se è presente una connessione Wifi
                //se attiva ma non associata a un router la disabilito
            WifiManager cm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
            if(cm.isWifiEnabled()){
                if(cm.getConnectionInfo().getSSID()==null){
                        cm.setWifiEnabled(false);
                }
            }
        }
}

Qui invece la classe che si occupa di ricevere una signal per avviare il servizio con BroadcastReceiver

Codice (Java): [Seleziona]
public class StartBoot extends BroadcastReceiver{
        //Attivo il brodcastrecever a avvio il servizio al boot
       
        @Override
        public void onReceive(Context context, Intent intent) {
                Intent myIntent=new Intent(context,ServicesEnergy.class);        
                context.startService(myIntent);
        }
}


Qui l'activity che vorrei eliminare , ma che non posso (leggete dopo per il motivo)
Codice (Java): [Seleziona]
public class MainActivity extends Activity {
        Intent servizio;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        servizio = new Intent(getApplicationContext(),ServicesEnergy.class);
        startService(servizio);
        finish();
    }
}



File AndroidManifest.xml

Codice (XML): [Seleziona]
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="org.altervista.alessiopiromallo.www.energysaving"
   android:versionCode="1"
   android:versionName="1.0" >

    <uses-sdk
       android:minSdkVersion="8"
       android:targetSdkVersion="15" />

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
   
    <application
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name"
       android:theme="@style/AppTheme" >
       
        <activity
           android:name="MainActivity"
           android:label="@string/title_activity_main" >
            <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
       
        <service android:name="ServicesEnergy">
            <intent-filter>
                <action android:name="com.example.prj_12_activity_service_start_boot" />
                </intent-filter>
        </service>
       
        <receiver android:name="StartBoot">
                        <intent-filter>
                                <action android:name="android.intent.action.BOOT_COMPLETED" />
                                <category android:name="android.intent.category.HOME" />
                        </intent-filter>
                </receiver>
               
    </application>
</manifest>


Problema

Il programma finziona correttamente ma se provo a modificarlo eliminando l'activity.java e il relativo richiamo nel A. Manifest.xml
questo programma, non si avvia al boot, e come se non ricevesse nessuna signal e  quindi StartBoot.java non avvia il servizio in background, infatti non è presente neanche nella lista programmi in esecuzione di android.

Se invece avvio il programma ANCHE SOLO UNA VOLTA NELLA SUA VITA dall' Activity questo si riavviera correttamente anche ai successivi reboot in modo AUTOMATICO.

E come se il programma non venisse attivato (CASO SENZA ACTIVITY)  cosa che non avviene se l'avvio del servizio viene fatto almeno 1 volta dall' activity


Richiesta


Mi consigliate un modo per eliminare quell activity definitamente è avviare il servizio al boot automaticamente senza incorrere nei problemi precedentemente descritti ?


Grazie

Offline auron86

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Re:Service Start On Boot, Senza uso Activity
« Risposta #1 il: 31 Agosto 2012, 16:45:25 CEST »
0
Qualche anima pia che può postare codice di un servizio che viene avviato al boot senza usare un activity di qualunque tipo ?

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:Service Start On Boot, Senza uso Activity
« Risposta #2 il: 01 Settembre 2012, 10:31:12 CEST »
0
Qualche anima pia che può postare codice di un servizio che viene avviato al boot senza usare un activity di qualunque tipo ?

Se nessuno posta, temo proprio tu sia l'apripista di questo argomento. Quando trovi la soluzione, se torni a descriverla brevemente salverai qualcuno che si troverà nella tua stessa situazione. :-)
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline milur

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: +2
    • Mostra profilo
  • Sistema operativo:
    windows xp
Re:Service Start On Boot, Senza uso Activity
« Risposta #3 il: 18 Settembre 2012, 06:45:55 CEST »
+1
ciao mi sa che il problema è nella registrazione del receiver
facendolo partire al boot e non al lancio dell'applicazione ha bisogno che specifichi il nome del processo che lo gestisce e i permessi propri che gli servono  :
Codice (XML): [Seleziona]
 <receiver
            android:name=".BootReceiver"
            android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
            android:process="nome_processo">



Offline milur

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: +2
    • Mostra profilo
  • Sistema operativo:
    windows xp
Re:Service Start On Boot, Senza uso Activity
« Risposta #4 il: 18 Settembre 2012, 06:50:47 CEST »
+1
Codice: [Seleziona]
<receiver
             android:name=".BootReceiver"
             android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
             android:process="nome_processo">



« Ultima modifica: 18 Settembre 2012, 06:53:54 CEST da milur »