JavascriptProva

martedì 26 luglio 2016

Impostazione del ciclo base fra due activities e un service (tecnica mia)

Riscrivo tutto il codice del mio sistema di interazione fra due Activities e un Service per generare intervalli di tempo casuali...

Ho già l'XML pronto per la precedente prova, che ho distrutto in seguito a un errore che mi ha fatto impazzire. L'XML lo riciclo.
Ho preparato un po' il codice di MainActivity:
public class MainActivity extends Activity {

 Button bttStart, bttStop, bttHide;
 SeekBar seekBarMin, seekBarMax;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  
 }

}
Ma per prima cosa mi conviene scrivere il Service chiamato TimerService, e bindarlo.
Scrivo il codice per bindarlo alle due attività:

TimerService:
class TimerService extends Service {

 IBinder mBinder=new LocalBinder();
 
 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return mBinder;
 }
 
 public class LocalBinder extends Binder{
  TimerService getService(){
   return TimerService.this;
  }
 }
 
}


Ora bindo con MainActivity
public class MainActivity extends Activity {

 TimerService mService;
 boolean mBound;
 
 Button bttStart, bttStop, bttHide;
 SeekBar seekBarMin, seekBarMax;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  
 }
 
 @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!=false){
   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;
   
  }
  
 };

}
Ecco, credo che ci sia tutto.
Passo a creare il binding anche con Form, l'altra activity:
public class Form extends Activity {

 TimerService mService;
 boolean mBound;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_form);
 }
 
 @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!=false){
   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;
   
  }
  
 };


}
Ecco. Ora, però, vorrei testare il corretto funzionamento.
Inserisco dei "segnali" negli eventi onCreate e onDestroy.
 @Override
 public void onCreate(){
  super.onCreate();
  Log.d("TIMERSERVICE","ONCREATE");
 }
 
 @Override
 public void onDestroy(){
  super.onDestroy();
  Log.d("TIMERSERVICE", "ONDESTROY");
 }
Metto dei segnali anche nei codici delle attività:

Main:
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  Log.d("MAIN", "ONCREATE");
  
 }

..........

 @Override
 public void onDestroy(){
  super.onDestroy();
  Log.d("MAIN", "ONDESTROY");
 }


Form:
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_form);
  
  Log.d("FORM", "ONCREATE");
 }

........

 @Override
 public void onDestroy(){
  super.onDestroy();
  Log.d("FORM","ONDESTROY");
 }

Ora devo inserire il codice per gli intervalli di tempo in TimerService:
 public void StartTime(){
  Intent intent=new Intent(getApplicationContext(),
        Form.class);
  PendingIntent pendingIntent=PendingIntent.getActivity(getApplicationContext(), 
                0,
                intent, 
                0);
  AlarmManager alarmManager=(AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
  alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
      SystemClock.elapsedRealtime()+5*1000, 
      pendingIntent);
 }
 
 public void StopTime(){
  Intent intent=new Intent(getApplicationContext(),
    Form.class);
  PendingIntent pendingIntent=PendingIntent.getActivity(getApplicationContext(), 
            0,
            intent, 
            0);
  AlarmManager alarmManager=(AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
  alarmManager.cancel(pendingIntent);
  if(pendingIntent!=null)pendingIntent.cancel();
 }
 
 boolean AlarmOn(){
  Intent intent=new Intent(getApplicationContext(),
    Form.class);
  boolean al=(PendingIntent.getActivity(getApplicationContext(),
            0,
            intent,
            PendingIntent.FLAG_NO_CREATE)!=null);
  return al;
         
 }
Ora scrivo il codice dei bottoni, e posiziono un bottone in Form, per muovermi fra attività e services.

Main:
  bttStart=(Button)findViewById(R.id.button1);
  
  bttStart.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    mService.StartTime();
    
   }
  });
  bttStop=(Button)findViewById(R.id.button2);
  
  bttStop.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    mService.StopTime();
    
   }
  });
 }


Form:
  button=(Button)findViewById(R.id.button1);
  button.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    mService.StartTime();
    
   }
  });
Credo sia pronto per la prova.
Registro il Service:
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <service android:name=".TimerService" />
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" > 
E vediamo...

Problemino iniziale: IllegalAccess: accesso alla classe TimerService non consentito.
Avevo dimenticato public:
public class TimerService extends Service {

 IBinder mBinder=new LocalBinder();
Semplice distrazione!
Corretto questo, il programma parte.

Secondo intoppo: da Form non torna indietro: ho dimenticato di mettere finish() nel codice del button di Form.
   @Override
   public void onClick(View v) {
    mService.StartTime();
    finish();
    
   }
Okay.
Funziona anche lo StopTime.

Ma adesso devo fare la prova relativa al problema che ieri mi ha fatto impazzire, terminando Main una volta che questo ha impostato alarmManager sul TimerService.
A tale scopo, metto un codice nel button che deve terminare il Main.
  bttHide=(Button)findViewById(R.id.bttHide);
  bttHide.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    finish();
    
   }
  });
E riproviamo...

Funziona anche questo!

Nessun commento:

Posta un commento