Autore Topic: AlarmManager su TabHost  (Letto 1157 volte)

Offline Fixxxer393

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
  • Sistema operativo:
    Windows 10
AlarmManager su TabHost
« il: 19 Ottobre 2013, 11:54:58 CEST »
0
Ho un problema a far funzionare l'alarmmanager sulla tabhost... praticamente non mi parte il timer e non capisco perchè...
Temporizzatore.java -> per creare il timer

Codice (Java): [Seleziona]
public class Temporizzatore extends Activity {
   
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_alarm_manager_example);
               
               
                try {
                       
                //Create a new PendingIntent and add it to the AlarmManager
                Intent intent = new Intent(this, Tab2.class);
                PendingIntent pendingIntent = PendingIntent.getActivity(this,
                    12345, intent, PendingIntent.FLAG_CANCEL_CURRENT);
                AlarmManager am =
                    (AlarmManager)getSystemService(Activity.ALARM_SERVICE);
                am.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(),
                                2*60*60,pendingIntent);
                       
                  } catch (Exception e) {}
        }
}

MainActivity.java -> classe principale dov'è definita la tabhost

Codice (Java): [Seleziona]
public class MainActivity extends TabActivity {

        public void onCreate(Bundle savedInstanceState) {
                 super.onCreate(savedInstanceState);           
               
                Resources ressources = getResources();
                TabHost tabHost = getTabHost();
               
        //Qui c'è la definizione delle tab che non scrivo per semplificare il codice
               
                 
        }
}

Tab2.java -> questa è la classe relativa alla tab2 dove si deve avviare il timer

Codice (Java): [Seleziona]
public class Tab2 extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //Alarm Manager
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        Toast.makeText(getApplicationContext(), "caricato", Toast.LENGTH_SHORT).show();
        //Fine Alarm Manager
       
        setContentView(R.layout.tab2_act);
     

//Qui c'è il codice che deve fare ogni tot secondi

Manifest
Codice (XML): [Seleziona]
        <receiver android:name=".Tab2"
                     android:enabled="true"
                     android:process=":remote">
            </receiver>


Praticamente mi serve che ogni tot secondi mi carichi il codice dentro alla tab2... però me lo carica solo alla creazione e non in loop... dove posso aver sbagliato ?

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:AlarmManager su TabHost
« Risposta #1 il: 19 Ottobre 2013, 12:47:36 CEST »
0
Non capisco molto il senso della cosa.
Una sola Activity è attiva in Android. Perchè mettere un Alarm dentro activity1 per poter caricare qualcosa in activity2?
Potresti registrarlo direttamente su act2.

Poi ci sarebbe anche da capire che cosa vuoi ricaricare dentro act2, perchè magari ci sono altri modi per farlo (listeners per esempio).

Da ultimo:
TabActivity | Android Developers
This class was deprecated in API level 13.
New applications should use Fragments instead of this class; to continue to run on older devices, you can use the v4 support library which provides a version of the Fragment API that is compatible down to DONUT.

Offline Fixxxer393

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
  • Sistema operativo:
    Windows 10
Re:AlarmManager su TabHost
« Risposta #2 il: 19 Ottobre 2013, 13:15:07 CEST »
0
Ti spiego brevemente... io sulla tab2 devo caricare una listview (già ho il codice ma non l'ho messo per semplificare la lettura) con dei dati presi da un database su un server remoto.
Però devo far si che se i dati contenuti nel database vengano modificati l'app possa leggerli e ricaricare la listview... così ho messo un alarm manager che ogni 2 secondi mi ricarica la pagina (mi è stato suggerito su un altro post in questo forum).... però non ho capito se devo mettere il richiamo dell'intent sulla classe tab2 o sulla mainactivity e se sintatticamente è giusta questa codifica....

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:AlarmManager su TabHost
« Risposta #3 il: 19 Ottobre 2013, 19:32:08 CEST »
0
Non so come hai organizzato l'aggiornamento dei dati dal server remoto e non so con quale frequenza questi dati possono subire variazioni.
In ogni caso, l'aggiornamento del tab2 ha un senso solo se è attivo a video, altrimenti l'alarmmanager non serve.

Se i dati li salvi anche su un db locale io valuterei l'utilizzo di un ContentObserver.

E cmq sostituirei il tutto con dei fragment.

Offline Fixxxer393

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
  • Sistema operativo:
    Windows 10
Re:AlarmManager su TabHost
« Risposta #4 il: 20 Ottobre 2013, 18:33:40 CEST »
0
Non so come hai organizzato l'aggiornamento dei dati dal server remoto e non so con quale frequenza questi dati possono subire variazioni.
In ogni caso, l'aggiornamento del tab2 ha un senso solo se è attivo a video, altrimenti l'alarmmanager non serve.

Se i dati li salvi anche su un db locale io valuterei l'utilizzo di un ContentObserver.

E cmq sostituirei il tutto con dei fragment.

Si devo aggiornare i dati solo quando l'app è aperta su tab2, non salvo i dati su db locale e deve avere una frequenza di aggiornamento di 1/2 secondi....

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:AlarmManager su TabHost
« Risposta #5 il: 21 Ottobre 2013, 09:23:17 CEST »
0
In questo potresti attivare l'alarm (ma anche disattivarlo) solo quando il tab2 è effettivamente a video.

E vista la frequenza, penso che potresti anche usare un Timer.
E' normalmente sconsigliato (perchè equivale ad avere un task sempre attivo).
Ma con una frequenza di 1/2 secondi ,un Alarm vale come un Timer.
Con l'accortezza di attivarlo su onResume e toglierlo su onPause.

Offline Fixxxer393

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
  • Sistema operativo:
    Windows 10
Re:AlarmManager su TabHost
« Risposta #6 il: 21 Ottobre 2013, 12:16:25 CEST »
0
Si ma il problema sta dove metto il richiamo all'Alarm considerando che ho una TabHost?

Come richiamo all'Alarm intendo questo:

Codice (Java): [Seleziona]
Intent intent = new Intent(this, Tab2.class);
                PendingIntent pendingIntent = PendingIntent.getActivity(this,
                    12345, intent, PendingIntent.FLAG_CANCEL_CURRENT);
                AlarmManager am =
                    (AlarmManager)getSystemService(Activity.ALARM_SERVICE);
                am.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(),
                                2*60*60,pendingIntent);

perchè se lo metto sulla main activity non mi crea la tabhost, se lo metto sulla classe tab2 invece mi fa andare in primo piano la tab2 e non mi fa spostare sulle altre tab....

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:AlarmManager su TabHost
« Risposta #7 il: 21 Ottobre 2013, 12:23:44 CEST »
0
Il punto secondo me è che l'alarmManager dovrebbe semplicemente aggiornare il contenuto del Tab2, non mandarti nel tab2, quindi richiamare il service/async/... che si preoccupa di interrogare il db remoto.

Offline Fixxxer393

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
  • Sistema operativo:
    Windows 10
Re:AlarmManager su TabHost
« Risposta #8 il: 21 Ottobre 2013, 12:36:12 CEST »
0
Il punto secondo me è che l'alarmManager dovrebbe semplicemente aggiornare il contenuto del Tab2, non mandarti nel tab2, quindi richiamare il service/async/... che si preoccupa di interrogare il db remoto.

e come si fà ? :P

Post unito: 21 Ottobre 2013, 18:43:39 CEST
uppo, ho risolto mettendo un timer che mi ricarica all'evento onStart la funzione che mi interroga il db ;)

Grazie del supporto ;)
« Ultima modifica: 21 Ottobre 2013, 18:43:39 CEST da Fixxxer393, Reason: Merged DoublePost »

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:AlarmManager su TabHost
« Risposta #9 il: 22 Ottobre 2013, 10:23:52 CEST »
+1
E' meglio usare onResume().
Ricordati di togliere il timer nell'onPause().

Activity | Android Developers

Offline Fixxxer393

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
  • Sistema operativo:
    Windows 10
Re:AlarmManager su TabHost
« Risposta #10 il: 22 Ottobre 2013, 15:35:42 CEST »
0
E' meglio usare onResume().
Ricordati di togliere il timer nell'onPause().

Activity | Android Developers

;) ok grazie mille per i consigli...