Autore Topic: Inviare notifica con applicazione in OnPause  (Letto 668 volte)

Offline dragonfly89

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: +1
    • Mostra profilo
Inviare notifica con applicazione in OnPause
« il: 27 Febbraio 2013, 01:48:33 CET »
0
ragazzi un'informazione semplice...supponiamo che io mi trovi ad usare una qualsiasi App..se premo il tasto Home del cell l'applicazione invoca in automatico il metodo OnPause() giusto?? ora,nel mio caso io ho un Services che aggiorna di continuo la Ui della App e in particolare vorrei che quando l'utente manda l'Activity in OnPause() non appena la Ui dell'activity viene aggiornata deve essere inviata una notifica al dispositivo...ora però il tutto non mi funziona e non capisco il perkè ovvero che non appena premo il tasto Home ovvero vado nel metodo OnPause() il mio services aggiorna in Background la Ui dell' activity ma non ricevo la notifica..io avevo provato a mettere nel metodo OnPause il metodo "SendNotification" che mi invia la notifica nella barra del cell...
Domanda: nel momento in cui l'Activity va in OnPause il Services con quale metodo di quest'ultima comunica affinchè possa venire richiamato il metodo BroadCast receiver che riceve il tutto dal services??? posto il codice delle mie 2 classi...

Codice (Java): [Seleziona]
package com.myProg.ita.thesis;

import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast;

public class ControllaLive extends Activity implements OnItemClickListener,MatchView {
       
        private static final int NOTIFICATION_ID = 1;
    private NotificationManager mNotificationManager;

        public static ListView listView;
        public static List<LiveRowItem> liveRow;


        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_controlla_live);

                liveRow = new ArrayList<LiveRowItem>();
                for (int i = 0; i < matchLive.size(); i++) {
                        LiveRowItem item = new LiveRowItem( parzialiLive.get(i),minutiDiGioco.get(i),risultatiLive.get(i),R.drawable.lente,this);
                        liveRow.add(item);
                }

                listView = (ListView) findViewById(android.R.id.list);
                RowLiveLayout adapter = new RowLiveLayout(this, liveRow);
                listView.setAdapter(adapter);
                listView.setOnItemClickListener(this);

                try{
                        startServices();
                }
                catch (Exception e) {
                        Log.i("ERRORE ", e.getMessage());
                }

        }
        private void startServices() {
                Log.e("", "faccio partire il services");
                startService(new Intent(this, ServiceLive.class));
        }
       
        public void aggiorna(){
                liveRow = new ArrayList<LiveRowItem>();
                for (int i = 0; i < matchLive.size(); i++) {
                        LiveRowItem item = new LiveRowItem( parzialiLive.get(i),minutiDiGioco.get(i),risultatiLive.get(i),R.drawable.lente,this);
                        liveRow.add(item);
                }

                RowLiveLayout adapter = new RowLiveLayout(this, liveRow);
                listView.setAdapter(adapter);
                listView.setOnItemClickListener(this);
       
        }
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
                Toast toast = Toast.makeText(getApplicationContext(),
                                "Item " + (position + 1) + ": " + liveRow.get(position),
                                Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0);
                toast.show();
        }

        public void onStop(){
                super.onStop();
               
                Log.e("", "sono nel metodo onSTOP ");
                unregisterReceiver(receiverDbf);
        }

        @Override
        public void onResume() {
                super.onResume();

                IntentFilter filter = new IntentFilter("com.example.updatelist");
                registerReceiver(receiverDbf, filter);
                Log.e("", "sono nel metodo onResume");
        }

        @Override
        public void onPause() {
                super.onPause();
       
                sendNotification();

//              unregisterReceiver(receiverDbf);
        }

        private final BroadcastReceiver receiverDbf = new BroadcastReceiver() {
               
                @Override
                public void onReceive(Context context, Intent intent) {
                        liveRow = new ArrayList<LiveRowItem>();
                        for (int i = 0; i < matchLive.size(); i++) {
                                LiveRowItem item = new LiveRowItem( parzialiLive.get(i),minutiDiGioco.get(i),risultatiLive.get(i),R.drawable.lente,ControllaLive.this);
                                liveRow.add(item);
                        }

                        listView = (ListView) findViewById(android.R.id.list);
                        RowLiveLayout adapter = new RowLiveLayout(ControllaLive.this, liveRow);
                        listView.setAdapter(adapter);
                        listView.setOnItemClickListener(ControllaLive.this);
                }
        };
       
        private void sendNotification(){
                 String ns = Context.NOTIFICATION_SERVICE;
         mNotificationManager = (NotificationManager) getSystemService(ns);
       
         int icon = android.R.drawable.stat_notify_chat;
         CharSequence tickerText = "Questo è il tickerText";
         long when = System.currentTimeMillis();
         @SuppressWarnings("deprecation")
                        Notification notification = new Notification(icon, tickerText, when);
       
         Context context = getApplicationContext();    
         CharSequence contentTitle = "Titolo della mia notifica";
         CharSequence contentText = "Testo della mia notifica";
         Intent notificationIntent = new Intent(this, ControllaLive.class);
         PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
         notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
       
         notification.defaults |= Notification.DEFAULT_SOUND;    //Suona
         notification.defaults |= Notification.DEFAULT_LIGHTS;   //LED
         notification.defaults |= Notification.DEFAULT_VIBRATE;  //Vibra


         mNotificationManager.notify(NOTIFICATION_ID, notification);
        }

}


Codice (Java): [Seleziona]
package com.myProg.ita.thesis;

import java.util.Timer;
import java.util.TimerTask;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class ServiceLive extends Service implements MatchView{

        private Timer timer;
        int cont;

        @Override
        public IBinder onBind(Intent intent) {
                // TODO Auto-generated method stub
                return null;
        }
        @Override
        public void onCreate() {
                // TODO Auto-generated method stub
                super.onCreate();
                cont = 0;
                Log.i("", "servizio avviato");

                TimerTask task = new TimerTask() {
                        @Override
                        public void run() {
                                Log.i("", "sto aggiornando l'activity");
                                cont++;
                                updateActivity();
                        }
                };
                timer = new Timer();
                timer.schedule(task, 0, 60000);
        }

        private void updateActivity(){
                parzialiLive.clear();
                minutiDiGioco.clear();
                risultatiLive.clear();
               
                Request request = new Request();
                Extrapolate extrap = new Extrapolate();

                String responce = request.connect();
                extrap.extrapolateData(responce);

                Intent intent = new Intent();
                intent.setAction("com.example.updatelist");
                sendBroadcast(intent); // finally broadcast

        }

}

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Inviare notifica con applicazione in OnPause
« Risposta #1 il: 27 Febbraio 2013, 09:26:54 CET »
0
la notifica devi mandarla dal service, non dall'activity. Il broadcast receiver della UI deve essere stoppato quando va in onPause l'activity.
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline dragonfly89

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: +1
    • Mostra profilo
Re:Inviare notifica con applicazione in OnPause
« Risposta #2 il: 27 Febbraio 2013, 16:49:32 CET »
0
Citazione
la notifica devi mandarla dal service, non dall'activity. Il broadcast receiver della UI deve essere stoppato quando va in onPause l'activity.

e ma quindi scusami,ti faccio un paio di domandine...l'OnPause dell'activity corrisponde o meno con la pressione del tasto Home del cell?? in tal caso io vorrei che,siccome l'activity in quel momento non è visibile all'utente, quest'ultimo venga aggiornato tramite notifica all'aggiornamento della Ui..non so se mi sono spiegato bene  :-)..
seconda domanda:
visto che la notifica la devo mandare dal Services,come faccio a sapere che la devo mandare solo nel caso in cui l'activity nn sia in quel momento visualizzata dall'utente??? cioè io come faccio a dire al services di mandare la notifica solo (per esempio) quando l'utente ha mandato l'activity in OnPause o in OnStop???
per questo motivo io la mandavo dall'activity stessa in modo tale che facendo l'override dei metodi sopra citati ero certo che la notifica venisse mandata solo in determinate circostanze..
grazie mille !!