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