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