JavascriptProva

martedì 2 agosto 2016

Ricostruzione da zero della mia App CoachCall, con l'impostazione di un Service in foreground: creazione del server e binding da parte delle due activities.

Ricomincio praticamente da zero.
Opto per un Service in foreground, che rimanga il fulcro di tutta l'applicazione.
Per crearlo, bisogna inserire nel metodo onCreate del Service un intent e un pendingintent, e quindi un oggetto Notification, che è quello che presenta la maggior novità.

Il costruttore è NotificationCompat.Builder(this).
A questo seguono setSmallIcon, setContentText, setContentTitle e setContentIntent.
Il primo fa riferimento a un'immagine, i successivi due a testo, e l'ultimo deve avere come parametro pendingIntent e quindi viene scritto il suo membro build().
Non è una nomenclatura tecnica, ma è efficace per ricordare.
Quindi si invoca startForeground con un numero identificativo che può essere anche 1, e la notifica per parametro.
Quindi la notifica ha bisogno del pendingIntent che ha bisogno dell'intent, e alla fine il metodo startForeground si serve della notifica.
Provo a scriverlo a memoria...

 @Override
 public void onCreate(){
  Intent intent=new Intent(this,MainActivity.class);
  PendingIntent pi=PendingIntent.getActivity(this, 0, intent, 0);
  Notification notification=new NotificationCompat.Builder(this)
    .setSmallIcon(R.drawable.cornetta)
    .setContentTitle("CoachCall")
    .setContentText("Chiamate dal Coach")
    .setContentIntent(pi).build();
    
 }
Ci sono arrivato...

Con questo ho un Service che dovrebbe essere inattaccabile.
Ora, questo service deve essere innescato dall'apertura dell'Activity principale, e ciò si può fare mediante il binding, che è peraltro necessario per tutte le altre activities che debbano interagire con esso eseguendone le funzioni.
Secondo passaggio, quindi, è quello di effettuare il binding.

Solito schema: nell'activity creo le variabili...
 TimerService mService;
 boolean mBound;
quindi procedo...
 @Override
 public void onStart(){
  super.onStart();
  Intent intent=new Intent(this,TimerService.class);
  bindService(intent,mConnection,Service.BIND_AUTO_CREATE);
 }
 
 @Override
 public void onStop(){
  super.onStop();
  if(mBound){
   unbindService(mConnection);
   mBound=false;
  }
 }
 
 ServiceConnection mConnection=new ServiceConnection(){

  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
   LocalBinder bnd=(LocalBinder)service;
   mService=bnd.getService();
                        mBound=true;
   
  }

  @Override
  public void onServiceDisconnected(ComponentName name) {
   mBound=false;
   
  }
  
 };
E su TimerService:
 IBinder mBinder=new LocalBinder();
e poi...
 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return mBinder;
 }
 
 public class LocalBinder extends Binder {
  TimerService getService(){
   return TimerService.this;
  }
 }
importando quindi LocalBinder su MainActivity (di solito faccio prima nel Service e poi nell'Activity).
Una volta fatto il bindaggio posso creare le funzioni che chiamano la terza Activity "a tempo".
Per far questo creo la terza Activity.

Ho dato a questa il formato XML di quella che era la mia originale (come del resto ho fatto con MainActivity)...
Faccio il binding.
Una volta fatto il binding, creo i "movimenti circolari" del meccanismo a tempo.

Nessun commento:

Posta un commento