2013-08-08 23 views
11

Uygulamamda bir etkinliğim ve hizmet var ... Hizmet, GPS'den alınan verilerden toplanan iletileri yayınlayacaktır ... Etkinlik, yayın iletilerini almalı ve kullanıcı arabirimini güncelleştirmelidir. Ben ayrı dosyada sınıf çalışıyor ServiceReceiver .... kullanıyorum düzgün çalışmıyorsa bu kodu ... kullandığınızda ...Hizmetten etkinliğe nasıl veri alınır

kodum

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); 
      } 
     } 
    } 
} 

söyle lütfen ... !!

cevap

21

Bu

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); 
} 

yazıp Etkinlik tarafında size bir Aktiviteye mesajı gönderebilirsiniz Bu arada bu Broadcast mesajı

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

almak zorundayız. burada mMessageReceiver

Bunu yapan benim kodunda

....

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

ve OnPause içindeki reciever kaydını silmek unutmak asla .... sen ne kadar istediğiniz performans göstereceğini sınıfta sınıftır –

+0

@FaisalNaseer Nasıl kayıt silebilirsiniz bazı örnek kodlar verebilirsiniz lütfen –

+0

Sadece 'unregisterReceiver (mMessageReceiver);' –

2

hizmetler ile iletişim kurmak için üç bariz yolu vardır:

  1. Amaçları kullanma.
  2. AIDL'yi kullanma.
  3. Hizmet nesnesinin kendisini kullanarak (tekil olarak).
5

Kullanmak için iyi bir yol Handler kullanıyor. Etkinliğinizde İşleyici'yi genişleten ve handleMessage yöntemini geçersiz kılan bir iç sınıf oluşturun.

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

Yani, aktivitede, özel işleyicisi oluşturmak ve hizmete geçmek:

Ardından, ServiceReceiver sınıfında, bir işleyici değişken ve benzeri bir kurucu oluşturun. Bu nedenle, etkinliğinize bazı veriler koymak istediğinizde Servisinize handler.sendMessage()'u koyabilirsiniz (içSınıfınızın handleMessage'unu arayacaktır). Benim Servis sınıfta

İlgili konular