31

私のアプリにはアクティビティとサービスがあります...サービスは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クラスを使用していますが、正常に動作します....教えてください...!!

4

5 に答える 5

61

私のサービスクラスで私はこれを書きました

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();
    }
};
于 2013-09-12T10:20:51.573 に答える
11

それを実現する良い方法は、Handler を使用することです。Handler を拡張するアクティビティで innerClass を作成し、handleMessageメソッドをオーバーライドします。

次に、ServiceReceiverクラスで、次のようなハンドラー変数とコンストラクターを作成します。

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

そのため、アクティビティでカスタム ハンドラーを作成し、それをサービスに渡します。したがって、アクティビティにデータを入れたい場合はhandler.sendMessage()、Service に入れることができます ( handleMessageinnerClass を呼び出します)。

于 2013-08-08T12:02:14.100 に答える
4

とのコミュニケーションには3つの明白な方法がありますservices

  1. インテントの使用。
  2. AIDL の使用。
  3. サービス オブジェクト自体を (シングルトンとして) 使用する。
于 2013-08-08T11:59:16.460 に答える