2013-08-08 23 views
11

私のアプリケーションでは、アクティビティとサービスがあります... サービスはGPSからのデータから収集したメッセージをブロードキャストします。 アクティビティはブロードキャストメッセージを受信し、UIを更新する必要があります私はこのコードを使用すると...サービスからアクティビティへのデータの取得方法

私のコード

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

それが正常に動作していない... 私は別のファイルにServiceReceiverクラスを使用していますと、正常に動作します.... 教えてください... !!

答えて

21

私はこの

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

を書いたとアクティビティ側で我々はあなたが活動にメッセージを送ることができるこの方法では

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

このブロードキャストメッセージを受信することがあります。 ここmMessageReceiver

私はこれをしなかった私のコードで

....

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

とonPause内のレシーバの登録を解除するのを忘れたことがない....あなたが欲しい、これまで何を実行するそのクラスのクラスです。 –

+0

@FaisalNaseer登録を解除するにはサンプルコードを教えてください –

+0

単純に 'unregisterReceiver(mMessageReceiver);' –

2

サービスと通信するには、3つの明確な方法があります。

  1. インテントを使用するには。
  2. AIDLの使用。
  3. サービスオブジェクト自体を(シングルトンとして)使用します。
5

ハンドラーを使用するとよい方法です。 ハンドラーを拡張し、handleMessageメソッドをオーバーライドする、あなたのアクティビティーでinnerClassを作成します。

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

だから、あなたの活動に、カスタムハンドラを作成して、あなたのサービスに渡し:

次に、あなたのServiceReceiverクラスで、ハンドラー変数などコンストラクタを作成します。したがって、あなたの活動にいくつかのデータを入れたいときは、handler.sendMessage()をあなたのサービスに入れてください(それはあなたのinnerClassのhandleMessageを呼ぶでしょう)。私のサービスクラスで

関連する問題