JavascriptProva

sabato 18 giugno 2016

AlarmManager gestito da un Service intermedio.

Creare un AlarmManager nel contesto di un Service in modo da chiamare un altro Service a intervalli.

Ecco fatto:

MainActivity:
public class MainActivity extends Activity {

 boolean flag=true;
 Button button;
 Button bttStart;
 Intent intent;
 AlarmManager alarmManager;
 PendingIntent pendingIntent;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  

  
  button=(Button)findViewById(R.id.button1);
  bttStart=(Button)findViewById(R.id.button2);
  
  button.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    stopService(new Intent(getApplicationContext(),BaseAlarm.class));
   }
  });
  
  bttStart.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    intent=new Intent(getApplicationContext(),BaseAlarm.class); 
    startService(intent);
    
   }
  });

  
 }
}


BaseAlarm (service):
public class BaseAlarm extends Service{
 Intent intent;
 PendingIntent pendingIntent;
 AlarmManager alarmManager;
 int mSecs=5*1000;
 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return null;
 }
 
 @Override
 public int onStartCommand(Intent intent, int flags, int startUI){
  Log.v("BASEALARM","ONSTARTCOMMAND");
  intent=new Intent(this,Servizio.class);
  pendingIntent=PendingIntent.getService(this, 0, intent, 0);
  alarmManager=(AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
  alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
          0, 
          mSecs, 
          pendingIntent);
  return Service.START_NOT_STICKY;
  
 }
 public void onDestroy(){
  alarmManager.cancel(pendingIntent);
  
   stopService(new Intent(getApplicationContext(),Servizio.class));
  
  
  super.onDestroy();
  Log.v("BASEALARM","ONDESTROY");
  
 }

}


Servizio (service):
public class Servizio extends Service implements TextToSpeech.OnInitListener,TextToSpeech.OnUtteranceCompletedListener{
 TextToSpeech tts;

 @Override
 public void onCreate(){
  tts=new TextToSpeech(this,this);
  Log.v("SEGNALE", "ONCREATE");
 }
 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return null;
 }

 @Override
 public void onInit(int status) {
  if(status==TextToSpeech.SUCCESS){
   int result=tts.setLanguage(Locale.ITALIAN);
   tts.setOnUtteranceCompletedListener(this);
   HashMap hashMap=new HashMap();
   hashMap.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "frase");

   tts.speak("Ciao, birichino.", TextToSpeech.QUEUE_FLUSH, hashMap);
  }
  Log.v("SEGNALE","ONINIT");
  
 }

 @Override
 public void onUtteranceCompleted(String utteranceId) {
  try{
   tts.stop();
   tts.shutdown();
   stopSelf();
  }catch(Exception e){}
  Log.v("SEGNALE","ONUTTERANCE");
  
 }
 
 @Override
 public void onDestroy(){
  super.onDestroy();
  Log.v("SEGNALE","ONDESTROY");
 }
 
}
Ho dovuto aggiungere un try...catch all'evento onDestroy di Servizio perché certamente la chiusura del TTS impiega del tempo per cui lo stopSelf veniva eseguito probabilmente in anticipo.

Nessun commento:

Posta un commento