Credo che la cosa migliore sia chiamare un service direttamente. Creare un Broadcast Receiver potrebbe avere senso se si volessero attivare più azioni contemporaneamente, o se si volesse intercettare un broadcast dal sistema.
Teniamo fermo questo aspetto.
E le acquisizioni che abbiamo fatto finora.
Dunque, mi devo esercitare nel binding di un service.
Focalizziamoci solo sopre ai services.
Ho creato un Service, in una classe a parte: la costruzione è piuttosto facile, implementando la classe Service: infatti si viene guidati fino a questo punto semplicemente implementando:
public class Servizio extends Service{ @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } }Ora ricordiamo che il Service si deve registrare.
Come si registra nel Manifest?
Io ricordo questo:
...... <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <service android:name="Servizio" /> <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> ......Ma vediamo se ricordo bene e soprattutto se è sufficiente...
S', va bene ma c'erano altre opzioni, che forse servono sia a permettere che il service sia chiamato da altre applicazioni sia a evitare che venga chiamato a sproposito...
Esploriamole. Non mi ricordo com'è che si chiamano...
Va bene, ma c'è anche l'opzione android:enabled che devo verificare.
Un'altra che non capisco è android:icon.
Il service, infatti, essendo un'operazione in background, che bisogno avrebbe di un'icona?
Credo sia relativo alla status bar... ma al momento lasciamo perdere...
Provo a chiamare un service così.
Sempre con il Toast, altimenti con il tts è troppo difficile. Mi eserciterò sempre con i toast, per il momento.
Ecco, ho aggiunto al Service l'evento onStartCommand:
public class Servizio extends Service{ @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public int onStartCommand(Intent intent, int flage, int startUI){ Toast.makeText(this, "SERVIZIO CHIAMATO", Toast.LENGTH_LONG).show(); return startUI; } }E lo chiamo, dallo stesso package, così:
public class MainActivity extends Activity { Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(getApplicationContext(),Servizio.class); startService(intent); } }); } }Non ha funzionato perché ho dimenticato di istanziare la variabile button.
...Ci ho riprovato e ho scoperto che non avevo avviato quella app ma un'altra!!!!!!!!
Riproviamo con tutti i codici a posto:
MainActivity:
public class MainActivity extends Activity { Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button=(Button)findViewById(R.id.button1); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(getApplicationContext(),Servizio.class); startService(intent); } }); } }
Servizio:
public class Servizio extends Service{ @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public int onStartCommand(Intent intent, int flage, int startUI){ Toast.makeText(this, "SERVIZIO CHIAMATO", Toast.LENGTH_LONG).show(); return startUI; } }FUNZIONA!
Bene, ho creato un service, l'ho registrato e l'ho chiamato dalla stessa app. Funziona!
Nessun commento:
Posta un commento