JavascriptProva

lunedì 13 giugno 2016

Creare un Service, registrarlo e chiamarlo dalla stessa App

Riprendiamo l'AlarmManager, sempre nell'intenzione di costruire un "ricordatore" per i farmaci.

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