Autore Topic: Service start on booting if checkbox is on  (Letto 2290 volte)

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Service start on booting if checkbox is on
« il: 28 Gennaio 2013, 14:44:44 CET »
0
Salve Ragazzi
Ho un service e una checkbox, vorrei che il servizio si avviasse all'avvio del telefono se la checkbox è selezionata mentre esso non si avviasse se la checkbox è deselezionata.
Ho provato a cercare in rete ma non ho trovato nulla al di fuori del classico BroadcastReceiver to the Android android.intent.action.BOOT_COMPLETED.
Grazie  :-)
Domani Smetto.

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Service start on booting if checkbox is on
« Risposta #1 il: 28 Gennaio 2013, 16:35:29 CET »
+1
mi pare che non è possibile abilitarlo dinamicamente, ma puoi sempre lasciare che si avvii sempre, e fare un "return void" in caso il checkbox non sia abilitato....
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Service start on booting if checkbox is on
« Risposta #2 il: 28 Gennaio 2013, 16:51:40 CET »
+1
Molto spesso una ricerchina sul forum ci da già le risposte:

Avviare app al boot se impostato.. - Android Developers Italia

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:Service start on booting if checkbox is on
« Risposta #3 il: 28 Gennaio 2013, 17:53:42 CET »
0
Molto spesso una ricerchina sul forum ci da già le risposte:

Avviare app al boot se impostato.. - Android Developers Italia

Avevo trovato quel topic, ma aimè non sono riuscito tramite esso a trarre una soluzione al mio problema.
Io ho questo Broadcast Receiver che avvia il servizio all'avvio in caso che la checkbox sia checckata.
Codice (Java): [Seleziona]
public class Receiver extends BroadcastReceiver {
private static final String TAG = "tweakmanager";      

@Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
                SharedPreferences preferences ;
                preferences = PreferenceManager.getDefaultSharedPreferences(context);
                if (preferences.getBoolean("checkboxPref", false)) {
                    Log.i(TAG, "doing nothing...");
                   
                }
                else{
                         Intent startServiceIntent = new Intent(context, Servizio.class);
                     context.startService(startServiceIntent);
                      }
       
}
}
}
   

E questa la sintassi della checkbox

Codice (Java): [Seleziona]
 final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
                  final CheckBox checkBox = (CheckBox) findViewById(R.id.checkbox);
                  checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener()
                  {
                      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
                      {
                          Boolean Check;
                          Check = preferences.getBoolean("checkboxPref", true);
                          if ( isChecked )
                          {
                                  avviaServizio();
                                  Check = true;
                          }
                          else
                                  arrestaServizio();
                                  Check = false;
                              SharedPreferences.Editor editor = preferences.edit();
                              editor.putBoolean("checkboxPref", Check);
                      editor.commit();
                      }
                  });
               

sfortunatamente però questo solo in teoria perchè in pratica non funziona
Grazie :-)
« Ultima modifica: 28 Gennaio 2013, 17:59:12 CET da Valeboccaccio »
Domani Smetto.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
R: Service start on booting if checkbox is on
« Risposta #4 il: 28 Gennaio 2013, 18:10:57 CET »
+1
Non mi sembra che usi il codice che ho postato nell'altro topic.
Con quello infatti tu dici al sistema che il receiver non deve proprio essere chiamato.

Inviato dal mio Galaxy Nexus con Tapatalk 2


Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:R: Service start on booting if checkbox is on
« Risposta #5 il: 29 Gennaio 2013, 10:20:41 CET »
0
Non mi sembra che usi il codice che ho postato nell'altro topic.
Con quello infatti tu dici al sistema che il receiver non deve proprio essere chiamato.

Inviato dal mio Galaxy Nexus con Tapatalk 2

Io ho provato e riprovato a capirci qualcosa dal topic del tuo link ma mi dispiace non ci riesco.
Con il mio codice:
Codice (Java): [Seleziona]
if (preferences.getBoolean("checkboxPref", false)) {
                    Log.i(TAG, "doing nothing...");
                   
                }
                else{
                         Intent startServiceIntent = new Intent(context, Servizio.class);
                     context.startService(startServiceIntent);
                      }

indico che se la checkboxPref = false non deve fare l'intent, else start intent.
Domani Smetto.

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:R: Service start on booting if checkbox is on
« Risposta #6 il: 29 Gennaio 2013, 11:36:25 CET »
+1
Io ho provato e riprovato a capirci qualcosa dal topic del tuo link ma mi dispiace non ci riesco.
Con il mio codice:
Codice (Java): [Seleziona]
if (preferences.getBoolean("checkboxPref", false)) {
                    Log.i(TAG, "doing nothing...");
                   
                }
                else{
                         Intent startServiceIntent = new Intent(context, Servizio.class);
                     context.startService(startServiceIntent);
                      }

indico che se la checkboxPref = false non deve fare l'intent, else start intent.
no, è il contrario!
preferences.getBoolean("name", false) vuol dire prendi la preference e usa false SOLO SE NON LA TROVI.
il che vuol dire:
if pref == true non fare niente, altrimenti esegui il service
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:R: Service start on booting if checkbox is on
« Risposta #7 il: 29 Gennaio 2013, 11:56:00 CET »
0
no, è il contrario!
preferences.getBoolean("name", false) vuol dire prendi la preference e usa false SOLO SE NON LA TROVI.
il che vuol dire:
if pref == true non fare niente, altrimenti esegui il service

Ho provato allora a sostituire preferences.getBoolean("name", false) con true dato che era il contrario, il risultato è che l'intent parte comunque, sia che la preference sia true sia che essa sia false.
Domani Smetto.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Service start on booting if checkbox is on
« Risposta #8 il: 29 Gennaio 2013, 13:04:11 CET »
+1
Allora, ricapitoliamo:
Dovresti avere un BroadcastReceiver (che nel codice sotto è nella classe OnBootReceiver) che intercetta il boot del telefono e fa partire il tuo servizio.
Con il codice che ti ho linkato riesci a attivare e disattivare il receiver in modo tale che se il receiver è disattivato (o meglio, non abilitato), il sistema non lo chiamerà quando avviene il boot.
Facendo in questo modo non devi preoccuparti di controllare se devi avviare o no il servizio dentro il boot receiver e inoltre migliori le performance dell'applicazione.

Quindi, quello che devi fare a livello concettuale è:

-Quando la tua checkbox viene checkata avvii il servizio e attivi il boot receiver
-Quando la tua checkbox viene uncheckata stoppi il servizio e disattivi il boot receiver

Per avviare e arrestare il servizio dovresti farcela da solo.

Per attivare e disattivare il boot receiver ecco a te le due funzioni già fatte:

Codice (Java): [Seleziona]
public void disabilitaBootReceiver(){
        int flag = PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
        ComponentName component = new ComponentName(EditPreferences.this, OnBootReceiver.class);
        getPackageManager().setComponentEnabledSetting(component, flag, PackageManager.DONT_KILL_APP);
}

Codice (Java): [Seleziona]
public void attivaBootReceiver(){
        int flag = PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
        ComponentName component = new ComponentName(EditPreferences.this, OnBootReceiver.class);
        getPackageManager().setComponentEnabledSetting(component, flag, PackageManager.DONT_KILL_APP);
}

Spero di essere stato chiaro ed esaustivo.

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:Service start on booting if checkbox is on
« Risposta #9 il: 29 Gennaio 2013, 15:03:53 CET »
0
Grazie, grazie e grazie Ricky per la soluzione e grazie Nicola_D per i suggerimenti.
Mi sono complicato la vita con SharedPreferences quando la soluzione è così semplice.
Grazie ancora.
Domani Smetto.

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:Service start on booting if checkbox is on
« Risposta #10 il: 29 Gennaio 2013, 17:34:52 CET »
0
Ragazzi so che mi avete dedicato già moltissimo tempo, ma nonostante adesso quando la checkbox è stata chekkata il servizio parte al boot e quando non è stata chekkata esso non parte, grazie al codice di Ricky, ho sempre il problema, che ho tentato a risolvere senza riuscirci, della checkbox, infatti non riesco a salvare con le SharedPreferences o in un db lo state della checkbox, in modo che ai successivi avvi dell'applicazione e del telefono essa rimanga chekkata o non in base alla decisione dell'user.
Vi ringrazio in anticipo se riuscirete a darmi nuovamente una mano.
Domani Smetto.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Service start on booting if checkbox is on
« Risposta #11 il: 29 Gennaio 2013, 17:44:52 CET »
+1
Posta il codice che hai provato e vediamo di sistemarlo.
Comunque, abbiamo un tutorial che spiega come si usano le SharedPreferences, dagli un occhio:
[facile] Semplice esempio di Shared Preferences - Android Developers Italia

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:Service start on booting if checkbox is on
« Risposta #12 il: 31 Gennaio 2013, 09:52:13 CET »
0
Posta il codice che hai provato e vediamo di sistemarlo.
Comunque, abbiamo un tutorial che spiega come si usano le SharedPreferences, dagli un occhio:
[facile] Semplice esempio di Shared Preferences - Android Developers Italia

Ciao Ricky, scusami per problemi di saluti non ho più potuto lavorare sull'app, comunque utilizzando il tutorial giorni fa sono riusciuto a scrivere questo codice, che però non funziona, infatti al click sulla checkbox il servizio non parte.

Codice (Java): [Seleziona]
public class Toolbar extends Activity {
         
     private final static String MY_PREFERENCES = "MyPref";
       
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.toolbar);
                updatePreferencesData();
                }

Codice (Java): [Seleziona]
public void savePreferencesData(View view) {
                  //final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
                  final SharedPreferences preferences = getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);
                  final SharedPreferences.Editor editor = preferences.edit();
                  final CheckBox checkBox = (CheckBox) findViewById(R.id.checkbox);
                  checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener()
                  {
                      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
                      {
                          Boolean Check;
                          Check = preferences.getBoolean("MyPref", true);
                          if ( isChecked )
                          {
                                  avviaServizio();
                                  Check = true;
                                  Toast.makeText(getApplicationContext(), "Toolbar avviata", Toast.LENGTH_SHORT).show();
                                  editor.putBoolean("MyPref", Check);
                                  editor.commit();
                                  updatePreferencesData();
                          }
                          else
                                  arrestaServizio();
                              Check = false;
                              Toast.makeText(getApplicationContext(), "Toolbar interrotta", Toast.LENGTH_SHORT).show();
                              //SharedPreferences.Editor editor = preferences.edit();
                              editor.putBoolean("MyPref", Check);
                   editor.commit();
                   updatePreferencesData();
                      }
                    });
                }
               

Codice (Java): [Seleziona]
 private void updatePreferencesData() {
                  SharedPreferences preferences = getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);
                  Boolean Check = preferences.getBoolean("MyPref", true);
                  CheckBox checkBox = (CheckBox) findViewById(R.id.checkbox);
                  checkBox.setChecked(Check);
                                // TODO Auto-generated method stub
               
                Log.i("ServiceDemo01", "Attivita creata");
        }

Codice (Java): [Seleziona]
@Override
        protected void onDestroy() {
                super.onDestroy();
                Log.i("ServiceDemo01", "Attivita distrutta");
        }

        private void avviaServizio() {
                startService(new Intent(this, Servizio.class));
                int flag = PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
            ComponentName component = new ComponentName(Toolbar.this, Receiver.class);
            getPackageManager().setComponentEnabledSetting(component, flag, PackageManager.DONT_KILL_APP);
        }

        private void arrestaServizio() {
                stopService(new Intent(this, Servizio.class));
                int flag = PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
     ComponentName component = new ComponentName(Toolbar.this, Receiver.class);
     getPackageManager().setComponentEnabledSetting(component, flag, PackageManager.DONT_KILL_APP);
        }

}

Grazie per l'aiuto.
Domani Smetto.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Service start on booting if checkbox is on
« Risposta #13 il: 31 Gennaio 2013, 10:54:46 CET »
+1
Non capisco bene il tuo codice.
Ad esempio, perchè chiami il metodo updatePreferencesData nel change listener della checkbox?
Inoltre, generalmente i listener si settano nell'oncreate.

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:Service start on booting if checkbox is on
« Risposta #14 il: 31 Gennaio 2013, 11:35:59 CET »
0
Non capisco bene il tuo codice.
Ad esempio, perchè chiami il metodo updatePreferencesData nel change listener della checkbox?
Inoltre, generalmente i listener si settano nell'oncreate.

Ho tolto gli updatePreferencesData nel change listener della checkbox inserendo updatePreferencesData in questo modo:
Codice (Java): [Seleziona]
public void savePreferencesData(View view) {
                 
                  final SharedPreferences preferences = getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);
                  final SharedPreferences.Editor editor = preferences.edit();
                  final CheckBox checkBox = (CheckBox) findViewById(R.id.checkbox);
                  checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener()
                  {
                      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
                      {
                          Boolean Check;
                          Check = preferences.getBoolean("MyPref", true);
                          if ( isChecked )
                          {
                                  avviaServizio();
                                  Check = true;
                                  Toast.makeText(getApplicationContext(), "Autocoupon avviata", Toast.LENGTH_SHORT).show();
                                  editor.putBoolean("MyPref", Check);
                                  editor.commit();
                                 
                          }
                          else
                              arrestaServizio();
                              Check = false;
                              Toast.makeText(getApplicationContext(), "Autocoupon interrotta", Toast.LENGTH_SHORT).show();
                              editor.putBoolean("MyPref", Check);
                              editor.commit();
                     
                      }
                    });
                 
                  updatePreferencesData();
                }

ma nonostante questo il problema persiste, ne il servizio parte o si stoppa al check della checkbox ne viene memorizzato il valore della checkbox, e quando entro nell'activity la checkbox è sempre chekkata.
L'unica differenza che trovo tra il mio codice e quello del tutorial è che SharedPreferences preferences, SharedPreferences editor e la checkbox sono dichiarati final ma non penso sia la causa del problema.
Grazie per l'aiuto che mi stai dando.
Domani Smetto.