2013-08-08 19 views
11

Nella mia app ho un'attività e un servizio ... Il servizio trasmetterà i messaggi raccolti dai dati dal GPS ... L'attività dovrebbe ricevere i messaggi di trasmissione e aggiornare l'interfaccia utente ...Come ottenere i dati dal servizio all'attività

mio codice

public class LocationPollerDemo extends Activity { 
    private static final int PERIOD = 10000; // 30 minutes 
    private PendingIntent pi = null; 
    private AlarmManager mgr = null; 
    private double lati; 
    private double longi; 
    private ServiceReceiver serviceReceiver; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mgr = (AlarmManager) getSystemService(ALARM_SERVICE); 

     Intent i = new Intent(this, LocationPoller.class); 

     i.putExtra(LocationPoller.EXTRA_INTENT, new Intent(this, ServiceReceiver.class)); 
     i.putExtra(LocationPoller.EXTRA_PROVIDER, LocationManager.GPS_PROVIDER); 

     pi = PendingIntent.getBroadcast(this, 0, i, 0); 
     mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), PERIOD, pi); 

     DebugLog.logTrace("On Create Demo"); 
     Toast.makeText(this, "Location polling every 30 minutes begun", Toast.LENGTH_LONG).show(); 
     serviceReceiver = new ServiceReceiver(); 
     IntentFilter filter = new IntentFilter("me"); 
     this.registerReceiver(serviceReceiver, filter); 
    } 

    class ServiceReceiver extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      File log = new File(Environment.getExternalStorageDirectory(), "Location2.txt"); 
      DebugLog.logTrace(Environment.getExternalStorageDirectory().getAbsolutePath()); 

      try { 
       BufferedWriter out = new BufferedWriter(new FileWriter(log.getAbsolutePath(), log.exists())); 

       out.write(new Date().toString()); 
       out.write(" : "); 

       Bundle b = intent.getExtras(); 
       Location loc = (Location) b.get(LocationPoller.EXTRA_LOCATION); 
       String msg; 

       if (loc == null) { 
        loc = (Location) b.get(LocationPoller.EXTRA_LASTKNOWN); 

        if (loc == null) { 
         msg = intent.getStringExtra(LocationPoller.EXTRA_ERROR); 
        } else { 
         msg = "TIMEOUT, lastKnown=" + loc.toString(); 
        } 
       } else { 
        msg = loc.toString(); 
       } 

       if (msg == null) { 
        msg = "Invalid broadcast received!"; 
       } 

       out.write(msg); 
       out.write("\n"); 
       out.close(); 
      } catch (IOException e) { 
       Log.e(getClass().getName(), "Exception appending to log file", e); 
       DebugLog.logException(e); 
      } 
     } 
    } 
} 

Quando uso questo codice non funziona correttamente ... sto usando ServiceReceiver classe nel file separato funziona bene .... prego di dirmi ... !!

risposta

21

Nella mia classe di servizio ho scritto questo

private static void sendMessageToActivity(Location l, String msg) { 
    Intent intent = new Intent("GPSLocationUpdates"); 
    // You can also include some extra data. 
    intent.putExtra("Status", msg); 
    Bundle b = new Bundle(); 
    b.putParcelable("Location", l); 
    intent.putExtra("Location", b); 
    LocalBroadcastManager.getInstance(context).sendBroadcast(intent); 
} 

e sul lato attività abbiamo a ricevere questo messaggio Broadcast

LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
      mMessageReceiver, new IntentFilter("GPSLocationUpdates")); 

In questo modo è possibile inviare un messaggio a un'attività. qui mMessageReceiver è la classe in quella classe si esibiranno quello che volete ....

nel mio codice ho fatto questo ....

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // Get extra data included in the Intent 
     String message = intent.getStringExtra("Status"); 
     Bundle b = intent.getBundleExtra("Location"); 
     lastKnownLoc = (Location) b.getParcelable("Location"); 
     if (lastKnownLoc != null) { 
      tvLatitude.setText(String.valueOf(lastKnownLoc.getLatitude())); 
      tvLongitude 
        .setText(String.valueOf(lastKnownLoc.getLongitude())); 
      tvAccuracy.setText(String.valueOf(lastKnownLoc.getAccuracy())); 
      tvTimestamp.setText((new Date(lastKnownLoc.getTime()) 
        .toString())); 
      tvProvider.setText(lastKnownLoc.getProvider()); 
     } 
     tvStatus.setText(message); 
     // Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 
    } 
}; 
+1

e mai dimenticare di annullare la registrazione ricevitore all'interno onPause –

+0

@FaisalNaseer Come annullare la registrazione puoi dare qualche esempio di codice per favore –

+0

semplicemente 'unregisterReceiver (mMessageReceiver);' –

2

Ci sono tre modi ovvi per comunicare con i servizi:

  1. utilizzo degli intenti.
  2. Utilizzo di AIDL.
  3. Utilizzo dell'oggetto servizio stesso (come singleton).
5

Un buon modo per utilizzarlo è Handler. Creare una innerClass nell'attività che estende Handler e Sostituisci il metodo handleMessage.

Poi, nella tua classe ServiceReceiver, creare una variabile gestore e un costruttore come:

public ServiceReceiver(Handler handler){ 
    this.handler = handler; 
} 

Così, nella sua attività, crea il tuo gestore personalizzato e passarlo al vostro servizio. Quindi, quando vuoi inserire alcuni dati nella tua attività, puoi inserire handler.sendMessage() nel tuo Servizio (chiamerà lo handleMessage della tua innerClass).

Problemi correlati