2013-08-08 41 views
11

Trong ứng dụng của tôi, tôi có hoạt động và dịch vụ ... Dịch vụ sẽ phát tin nhắn được thu thập từ dữ liệu từ GPS ... Hoạt động sẽ nhận được tin nhắn quảng bá và cập nhật giao diện người dùng ...Cách nhận dữ liệu từ dịch vụ đến hoạt động

mã của tôi

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

Khi tôi sử dụng mã này nó không hoạt động đúng ... tôi đang sử dụng ServiceReceiver lớp trong tập tin riêng biệt hoạt động tốt .... xin vui lòng cho tôi biết ... !!

Trả lời

21

Trong lớp dịch vụ của tôi, tôi đã viết này

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

và ở phía Hoạt động chúng ta phải nhận được thư Broadcast

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

Bằng cách này bạn có thể gửi thông điệp tới một hoạt động. đây mMessageReceiver là lớp trong lớp mà bạn sẽ thực hiện những gì đã bao giờ bạn muốn ....

trong mã của tôi, tôi đã làm điều này ....

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

và không bao giờ quên unregister reciever bên onPause –

+0

@FaisalNaseer Làm cách nào để hủy đăng ký, bạn có thể cung cấp một số mã mẫu, vui lòng –

+0

Chỉ cần 'unregisterReceiver (mMessageReceiver);' –

2

Có ba cách rõ ràng để giao tiếp với các dịch vụ:

  1. Sử dụng Intents.
  2. Sử dụng AIDL.
  3. Sử dụng chính đối tượng dịch vụ (như singleton).
5

Cách tốt nhất để có nó là sử dụng Trình xử lý. Tạo một innerClass trong hoạt động của bạn mở rộng Trình xử lý và ghi đè phương thức handleMessage.

Sau đó, trong lớp ServiceReceiver của bạn, tạo ra một biến xử lý và một nhà xây dựng như:

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

Vì vậy, trong hoạt động của bạn, tạo xử lý tuỳ chỉnh của bạn và vượt qua nó để dịch vụ của bạn. Vì vậy, khi bạn muốn đưa một số dữ liệu vào hoạt động của mình, bạn có thể đặt handler.sendMessage() trong Dịch vụ của mình (nó sẽ gọi handleMessage của innerClass của bạn).

Các vấn đề liên quan