Autore Topic: Effettuare operazioni allo stesso orario tutti i giorni  (Letto 1061 volte)

Offline GennyAndroid

  • Utente junior
  • **
  • Post: 116
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Play Store ID:
    Gennaro Petito
  • Sistema operativo:
    Windows 7
Effettuare operazioni allo stesso orario tutti i giorni
« il: 04 Marzo 2013, 18:54:37 CET »
0
Salve raga, ho bisogno di realizzare un app che si colleghi alla rete per tre volte al giorno ( alle 13:00 , 17:00, 21:00 )

Per far ciò a quanto ho capito devo:
1)- sfruttare un BroadcastReceiver che si avvi alla accensione del cellulare ( BootReceiver.class )
2)- nel suo onReceive() devo realizzare un AlarmManager
3)- l'AlarmManager deve impostare i 3 orari
4)- devo realizzare un'altro BroadcastReceiver che si attivi allo scoccare dei 3 orari ( AlarmReceiver.class )
5)- il secondo BroadcastReceiver deve far partire un Service ( ConnectService.class )
6)- il Service scaricherà dei dati dalla rete e farà partire una notifica, dopo di che  che se cliccata aprirà un'Activity ( MainActivity.class )

Innanzi tutto vi chiedo: è giusto l'approccio?

Vorrei con il vostro aiuto implementare passo passo tutti i vari componenti.

Manifest.xml:

Codice (XML): [Seleziona]
<application
       android:allowBackup="true"
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name"
       android:theme="@style/AppTheme" >
        <activity
           android:name="it.petitogennaro.broadcastreceiver1.MainActivity"
           android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".BootReceiver">
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                    <category android:name="android.intent.category.HOME" />
                </intent-filter>
        </receiver>
       
        <receiver android:name=".AlarmReceiver">
            <intent-filter>
                <action android:name="???" />
            </intent-filter>
        </receiver>
       
        <service android:name="MyService" />
       
    </application>

Ho messo questo action : "android.intent.action.BOOT_COMPLETED" e a quanto ho capito è quello giusto, ma non ho ben capito perchè bisogna utilizzare il category : android.intent.category.HOME, a cosa serve?

Nel secondo broadcast, non ho ben capito quale action devo inserire, o meglio so che dovrei inserire un action creato da me, ma questo dove va fatto?

( BootReceiver.class : )


Codice (Java): [Seleziona]
import java.util.Calendar;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
 
public class BootReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
               
                Calendar cal = Calendar.getInstance();
           
            cal.set(Calendar.DAY_OF_MONTH, 13);
            cal.set(Calendar.HOUR_OF_DAY, 0);
            cal.set(Calendar.MINUTE, 0);
           
            Intent alarmintent = new Intent(context, AlarmReceiver.class);
           
            PendingIntent sender = PendingIntent.getBroadcast(context, 0, alarmintent,PendingIntent.FLAG_UPDATE_CURRENT);
           
            /*
            PER CREARE UN ALARM MANAGER ERO SOLITO FARE COSI:
            AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
            Ma ho dovuto scriverlo così. va bene?
            */

            AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
        }
}

Come si può dedurre dai commenti ho sempre realizzato un'allarm manager all'interno di un'activity, stavolta però trovandomi in un broadcast ho paura di aver scritto male l'allarm, e quindi vi chiedo se potete dargli un'occhiata.

Per adesso mi fermo qui, così da rendere il topic più leggibile grazie
« Ultima modifica: 04 Marzo 2013, 20:29:43 CET da GennyAndroid »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Effettuare operazioni allo stesso orario tutti i giorni
« Risposta #1 il: 04 Marzo 2013, 19:25:48 CET »
0
Ciao,
in queste righe di codice tu dici che il pending intent deve essere diretto verso la classe AlarmReceiver. In gergo, usi un intent esplicito.

Codice (Java): [Seleziona]
            Intent alarmintent = new Intent(context, AlarmReceiver.class);
            PendingIntent sender = PendingIntent.getBroadcast(context, 0, alarmintent,PendingIntent.FLAG_UPDATE_CURRENT);

quindi in realtà non ti serve mettere l'action.
Dovrebbe essere sufficiente cambiare

Codice (XML): [Seleziona]
        <receiver android:name=".AlarmReceiver">
            <intent-filter>
                <action android:name="???" />
            </intent-filter>
        </receiver>

in

Codice (XML): [Seleziona]
        <receiver android:name=".AlarmReceiver" />


Se invece volessi utilizzare un intent detto "implicito" (quindi utilizzando un action) potresti fare in questo modo:

Codice (Java): [Seleziona]
            Intent alarmintent = new Intent("il.tuo.package.ALARM_RECEIVER_ACTION");
            PendingIntent sender = PendingIntent.getBroadcast(context, 0, alarmintent,PendingIntent.FLAG_UPDATE_CURRENT);

Codice (XML): [Seleziona]
        <receiver android:name=".AlarmReceiver">
            <intent-filter>
                <action android:name="il.tuo.package.ALARM_RECEIVER_ACTION" />
            </intent-filter>
        </receiver>

Per approfondire l'argomento: [Facile] Broadcast Receiver - Android Developers Italia

Offline GennyAndroid

  • Utente junior
  • **
  • Post: 116
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Play Store ID:
    Gennaro Petito
  • Sistema operativo:
    Windows 7
Re:Effettuare operazioni allo stesso orario tutti i giorni
« Risposta #2 il: 04 Marzo 2013, 20:29:30 CET »
0
ti ringrazio per l'aiuto, a questo punto preferisco la prima soluzione, ovvero utilizzare un Intent esplicito

Codice (XML): [Seleziona]
<receiver android:name=".AlarmReceiver" />
Per il resto, tu credi che vada bene?
L'idea di base è giusta?

Inoltre stavo pensando, che così per come ho strutturato l'app alla prima installazione dato che il primo broadcast receveir non viene mai richiesto (dato che questo viene chiamato solo all'accensione ).

Ho pensato che potrei richiamarlo solo al primo avvio in una mia activity, e quindi la mia domanda è:

E' posibile richiamare anche il primo braodcast esplicitamente quindi in questo modo:

Codice (Java): [Seleziona]
Intent alarmintent = new Intent(context, BoatReceiver.class);
            PendingIntent sender = PendingIntent.getBroadcast(context, 0, alarmintent,PendingIntent.FLAG_UPDATE_CURRENT);

nonostante il fatto che questo ha un action come questa? :

Codice (XML): [Seleziona]
<receiver android:name="BootReceiver">
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                    <category android:name="android.intent.category.HOME" />
                </intent-filter>
        </receiver>

Post unito: 06 Marzo 2013, 15:19:16 CET





Ho pensato di cambiare la struttura iniziale dell'app:

Codice: [Seleziona]
1)- sfruttare un BroadcastReceiver che si avvi alla accensione del cellulare ( BootReceiver.class )
2)- nel suo onReceive() devo realizzare un AlarmManager
3)- l'AlarmManager deve impostare i 3 orari
4)- devo realizzare un'altro BroadcastReceiver che si attivi allo scoccare dei 3 orari ( AlarmReceiver.class )
5)- il secondo BroadcastReceiver deve far partire un Service ( ConnectService.class )
6)- il Service scaricherà dei dati dalla rete e farà partire una notifica, dopo di che  che se cliccata aprirà un'Activity ( MainActivity.class )

in questa:

Codice: [Seleziona]
1)- sfruttare un BroadcastReceiver che si avvi alla accensione del cellulare ( BootReceiver.class )
2)- nel suo onReceive() devo realizzare un AlarmManager
3)- l'AlarmManager deve impostare i 3 orari
4)- allo scoccare di ogni orario deve partire un Service ( ConnectService.class )
5)- il Service scaricherà dei dati dalla rete e farà partire una notifica, dopo di che  che se cliccata aprirà un'Activity ( MainActivity.class )

In sostanza ho eliminato il secondo BroadCast, perchè penso che così si riesca a fare lo stesso lavoro con un componente in meno.

Quindi vengo alle domande:
1) L'eliminazione del secondo BoradCast non è un problema?
2) Come ho gia chiesto nell'altro post: posso richiamare il Broadcast BootReceiver.class da una mia activity in questo modo:

Codice (Java): [Seleziona]
Intent alarmintent = new Intent(context, BoatReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(context, 0, alarmintent,PendingIntent.FLAG_UPDATE_CURRENT);

nonostante il fatto che ho definito nel manifest che deve partire anche all'avvio del cellulare?

3) In sostanza nel onReceive di BootReceiver.class creo un orario preciso in cui attivare un servizio, la mia domanda è:
per come ho realizzato il broadcast (VEDI SOTTO) il servizio parte tutti i giorni a quell'orario o solo la prima volta?

Codice (Java): [Seleziona]
public void onReceive(Context context, Intent intent) {
               
                Calendar cal = Calendar.getInstance();
           
            cal.set(Calendar.HOUR_OF_DAY, 18);
            cal.set(Calendar.MINUTE, 20);
           
            Intent serviceIntent = new Intent(context, MyService.class);
           
            //PENDING INTENT
            PendingIntent pendingIntent = PendingIntent.getService(context, 0, serviceIntent, 0);
           
            /*
            PER CREARE UN ALARM MANAGER ERO SOLITO FARE COSI:
            AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
            Ma ho dovuto scriverlo così. va bene?
            */

            AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
        }
« Ultima modifica: 06 Marzo 2013, 16:00:15 CET da GennyAndroid »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Effettuare operazioni allo stesso orario tutti i giorni
« Risposta #3 il: 07 Marzo 2013, 11:58:34 CET »
0
Secondo me stai facendo tutto nel modo corretto, a occhio non vedo nulla di errato. Poi magari facendolo girare vedi che c'è qualche problema, ma perlomeno il concetto, secondo me è giusto.
Il broadcast receiver che hai impostato per il boot mi risulta che puoi riutilizzarlo senza problemi come giustamente stai facendo.

Per l'alarm manager, se la tua operazione è sufficiente che venga eseguita una volta al giorno, non necessariamente alle 18.20 spaccate considera l'uso del metodo setInexactRepeating che è più efficiente di setRepeating.

Offline GennyAndroid

  • Utente junior
  • **
  • Post: 116
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Play Store ID:
    Gennaro Petito
  • Sistema operativo:
    Windows 7
Re:Effettuare operazioni allo stesso orario tutti i giorni
« Risposta #4 il: 07 Marzo 2013, 13:02:31 CET »
0
purtroppo ho bisogno che venga settato proprio in un orario preciso, e ti dirò di più saranno 3 gli orari, e quindi ti domando, c'è un modo per realizzare un alarm manager con tre orari, o devo creare 3 distinti alarm manager?

grazie mille per il tuo messaggio molto rincuorante, spero di non illudermi ;)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Effettuare operazioni allo stesso orario tutti i giorni
« Risposta #5 il: 07 Marzo 2013, 13:06:58 CET »
0
purtroppo ho bisogno che venga settato proprio in un orario preciso, e ti dirò di più saranno 3 gli orari, e quindi ti domando, c'è un modo per realizzare un alarm manager con tre orari, o devo creare 3 distinti alarm manager?

grazie mille per il tuo messaggio molto rincuorante, spero di non illudermi ;)

Beh usi un solo AlarmManager e fai tre diversi set ;)