Autore Topic: Service che si avvia in automatico a ore prestabilite  (Letto 1306 volte)

Offline GennyAndroid

  • Utente junior
  • **
  • Post: 115
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Play Store ID:
    Gennaro Petito
  • Sistema operativo:
    Windows 7
Service che si avvia in automatico a ore prestabilite
« il: 02 Marzo 2013, 18:24:04 CET »
0
Salve raga, vorrei chiedervi se fosse possibile far partire un service in automatico ad ore prestabilite del giorno, inoltre se ciò fosse possibile mi chiedevo se il service rimarrebbe attivo tutta la giornata o se questo a fine operazione si possa chiedere.

Scusatemi, ma non ho mai realizzato un service di questo tipo, di solito li faccio partire da una mia activity, mentre in questo caso, si tratta di una azione pianificata, spero di essermi spiegato, grazie a tutti
« Ultima modifica: 04 Marzo 2013, 12:18:50 CET da GennyAndroid »

Offline grishnackh86

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Galaxy W
  • Play Store ID:
    Stefano+Paolessi
  • Sistema operativo:
    OpenSuse 12.3
Re:Service che si avvia in automatico a ore prestabilite
« Risposta #1 il: 28 Marzo 2013, 14:18:32 CET »
0
Ciao, premetto che non sono esperto, cmq sto realizzando proprio ora un'app che ogni lunedì ad una certa ora invia una notifica...
Quello che ho fatto è realizzare un broadcastReceiver (che riceve il boot del dispositivo)...questo fa partire un alarmmanager impostato su una data scelta da me che a sua volta manda una notifica...Spero di esserti stato chiaro, cmq ti posto il codice.
(Il codice funziona ma ha un grosso problema, ad ogni avvio del dispositivo visualizza una notifica...sto cercando di risolvere)

Questa è la parte del manifest che ci interessa
Codice (XML): [Seleziona]
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
        <uses-permission android:name="android.permission.WAKE_LOCK" />
       

    <application>
       
                <receiver android:name=".Alarm">
                    <intent-filter>
                        <action android:name="android.intent.action.BOOT_COMPLETED"></action>
                </intent-filter>
                </receiver>

Qui c'è il broadcastreceiver
Codice (Java): [Seleziona]
public class Alarm extends BroadcastReceiver {    
           
             @Override
             public void onReceive(Context context, Intent intent)   {  
                 if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")){
                         PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
                         PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
                         wl.acquire();    
                         //qui va il codice che devi eseguire
                         wl.release();
                 }
             }
       
        public void SetAlarm(Context context)
         {
                 
                AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
             Intent i = new Intent(context, NotificationActivity.class); //fa partire la notifica
             PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
             Calendar calendar = new GregorianCalendar();
             calendar.set(Calendar.DAY_OF_WEEK, 2); // 2 corrisponde a lunedì
             calendar.set(Calendar.HOUR_OF_DAY, 9);
             calendar.set(Calendar.MINUTE, 30);
             calendar.set(Calendar.SECOND, 0);
             
             am.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000*60*3, pi); //1000*60*3 = alarm si ripete ogni 3 minuti
           
         }
       
         public void CancelAlarm(Context context)
         {
             
                 Intent intent = new Intent(context, Alarm.class);
             PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
             AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
             alarmManager.cancel(sender);
         }
        }

Offline lorux

  • Utente junior
  • **
  • Post: 97
  • Respect: +12
    • Google+
    • lor.catalano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows
Re:Service che si avvia in automatico a ore prestabilite
« Risposta #2 il: 28 Marzo 2013, 15:06:16 CET »
0
mi sa che

Codice (Java): [Seleziona]
Calendar calendar = new GregorianCalendar();
             calendar.set(Calendar.DAY_OF_WEEK, 2); // 2 corrisponde a lunedì
             calendar.set(Calendar.HOUR_OF_DAY, 9);
             calendar.set(Calendar.MINUTE, 30);
             calendar.set(Calendar.SECOND, 0);

stai settando una data passata(quella di oggi alle 9 e mezza),quindi la notifica parte subito

Offline grishnackh86

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Galaxy W
  • Play Store ID:
    Stefano+Paolessi
  • Sistema operativo:
    OpenSuse 12.3
Re:Service che si avvia in automatico a ore prestabilite
« Risposta #3 il: 28 Marzo 2013, 20:59:33 CET »
0
Come dovrei procedere per settare la notifica ogni lunedì per quell'ora?  :-P

EDIT:
Questo codice potrebbe funzionare?
Codice (Java): [Seleziona]
long day = 0;
        Calendar dayCalendar = Calendar.getInstance();
        long dayOfWeek = dayCalendar.get(Calendar.DAY_OF_WEEK);
        if (dayOfWeek == 1){ //Sunday
            day = System.currentTimeMillis();
        }
        if (dayOfWeek == 2){ //Monday
            day = 24*60*60*1000*2;
        }
        if (dayOfWeek == 3){ //Tuesday
            day = 24*60*60*1000*3;
        }
        if (dayOfWeek == 4){ //Wednesday
            day = 24*60*60*1000*4;
        }
        if (dayOfWeek == 5){ //Thursday
            day = 24*60*60*1000*5;
        }
        if (dayOfWeek == 6){ //Friday
            day = 24*60*60*1000*6;
        }
        if (dayOfWeek == 7){ //Saturday
            day = 24*60*60*1000;
        }
am.setRepeating(AlarmManager.RTC_WAKEUP, day, AlarmManager.INTERVAL_DAY, pi);
« Ultima modifica: 28 Marzo 2013, 21:18:16 CET da grishnackh86 »

Offline lorux

  • Utente junior
  • **
  • Post: 97
  • Respect: +12
    • Google+
    • lor.catalano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows
Re:Service che si avvia in automatico a ore prestabilite
« Risposta #4 il: 29 Marzo 2013, 10:25:43 CET »
+1
controlla cmq la data che stai passando all'alarm manager eh nn sono sicuro al 100% che il problema sia quello.
cmd ho trovato questo,magari ti è utile
Codice (Java): [Seleziona]
Calendar now = Calendar.getInstance();  
int weekday = now.get(Calendar.DAY_OF_WEEK);  
if (weekday != Calendar.MONDAY)  
{  
    // calculate how much to add  
    // the 2 is the difference between Saturday and Monday  
    int days = (Calendar.SATURDAY - weekday + 2) % 7;  
    now.add(Calendar.DAY_OF_YEAR, days);  
}  
dovresti settare le 9 e mezza dopo che aggiunge i giorni al calendar.
occhio che cmq qua entra nell'if solo se attualmente non è luned'.dovresti gestirti anche quel caso

Offline grishnackh86

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Galaxy W
  • Play Store ID:
    Stefano+Paolessi
  • Sistema operativo:
    OpenSuse 12.3
Re:Service che si avvia in automatico a ore prestabilite
« Risposta #5 il: 29 Marzo 2013, 11:57:47 CET »
0
Ottimo, grazie alla tua risposta forse ce l'ho fatta.... non ho capito bene il calcolo che viene effettuato per assegnare il valore a days (se non ti rubo troppo tempo, mi potresti spiegare?). Grazie dell'aiuto  ;-)
Cmq posto il codice che sto utilizzando...testato e funzionante per due settimane, non sono sicuro che possa funzionare nei lunghi periodi


Codice (Java): [Seleziona]
AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(context, NotificationActivity.class); //notificationActivity.class
            PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
               
            Calendar calNow = Calendar.getInstance();
                Calendar calSet = Calendar.getInstance();
                calSet.set(Calendar.DAY_OF_WEEK, 6); //venerdì
                calSet.set(Calendar.HOUR_OF_DAY, 10);
                calSet.set(Calendar.MINUTE, 32);
                calSet.set(Calendar.SECOND, 0);
                calSet.set(Calendar.MILLISECOND, 0);

                if (calSet.before(calNow)) {
                    calSet.add(Calendar.WEEK_OF_YEAR, 1);
                } else {
                        calSet.add(Calendar.WEEK_OF_YEAR, 0);
                }
                am.setRepeating(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(), AlarmManager.INTERVAL_DAY*7, pi);

Offline pegaso993

  • Utente junior
  • **
  • Post: 84
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    note 2
  • Sistema operativo:
    android
Re:Service che si avvia in automatico a ore prestabilite
« Risposta #6 il: 29 Settembre 2013, 17:13:55 CEST »
0
ciao ragazzi allora ho un problema

public void onClickSetAlarm(View v)
   {
      //Get the current time and set alarm after 10 seconds from current time
      // so here we get
      alarmManager.set( AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000 , pendingIntent );
   }
   private void RegisterAlarmBroadcast()
   {
        Log.i("Alarm Example:RegisterAlarmBroadcast()", "Going to register Intent.RegisterAlramBroadcast");
      
      //This is the call back function(BroadcastReceiver) which will be call when your
      //alarm time will reached.
      mReceiver = new BroadcastReceiver()
      {
         private static final String TAG = "Alarm Example Receiver";
          @Override
          public void onReceive(Context context, Intent intent)
          {
            Log.i(TAG,"BroadcastReceiver::OnReceive() >>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
            Toast.makeText(context, "Congrats!. Your Alarm time has been reached", Toast.LENGTH_LONG).show();
          }
      };

vorrei eseguire questa funzione ogni lunedi alle 12

Offline grishnackh86

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Galaxy W
  • Play Store ID:
    Stefano+Paolessi
  • Sistema operativo:
    OpenSuse 12.3
Re:Service che si avvia in automatico a ore prestabilite
« Risposta #7 il: 30 Settembre 2013, 14:32:05 CEST »
+1
il codice che ho postato sopra funziona!  ;-)

Offline pegaso993

  • Utente junior
  • **
  • Post: 84
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    note 2
  • Sistema operativo:
    android
Re:Service che si avvia in automatico a ore prestabilite
« Risposta #8 il: 06 Ottobre 2013, 01:03:56 CEST »
0
apposto grazie
« Ultima modifica: 06 Ottobre 2013, 01:09:38 CEST da pegaso993 »