3

Service と BroadcastReceiver を混同しています。私はロケーションベースのアプリに取り組んでいます。これでは、ユーザーの場所が大幅に変更されたときはいつでも(たとえば10メートル)、ユーザーの場所をデータベースに保存したいと考えています。

私は LocationListener を使用していますが、正常に動作しています。しかし、私のジレンマは次のとおりです。 onLocationChanged() メソッドをどこに書くか - BroadcastReceiver の onReceive() メソッドまたはサービスで?

Service を使用している場合、 Service のどのメソッドで、以下のコードを記述しますか?

これが私のロケーションリスナーです:

    LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

    LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            if(location != null){
                //Code to populate location-data into the database table.
            }

        public void onStatusChanged(String provider, int status, Bundle extras) {}

        public void onProviderEnabled(String provider) {}

        public void onProviderDisabled(String provider) {}
      };

    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5, 10, locationListener);

誰かがそれを実装するためのより良い方法を教えてもらえますか? Service と BroadcastReceiver の両方に関する Android Developer Docs をすべて読みましたが、まだそれらの使用法を区別できませんか?

4

3 に答える 3

2

それはあなたの目的によります。バックグラウンドで位置をキャッチしたい場合は、Service で使用します。

BroadcastReciever の onReceive メソッドは、登録したアクションが受信するときにのみ呼び出されます。

フォアグラウンドで実行したい場合は、アクティビティで簡​​単に使用できます。ただし、アクティビティが閉鎖されている場合は、場所を取得できません。

したがって、機能に応じて決定します。

于 2012-10-19T12:59:31.593 に答える
2

サービスは、バックグラウンドでコードを実行するために使用され、主にダウンロード、音楽再生に使用されます..ユーザーがアプリをバックグラウンドに置いた後 (ホームまたは戻るボタンを押す)。 BroadcastReceiversメソッドを介して送信されたメッセージを受信するために使用されsendBroadcast()、Bluetooth、インターネットの可用性などのシステム通知をキャッチし、他のアプリからメッセージを取得するために使用されます...

BroadcastReceiverアプリがバックグラウンドにある場合、場所の変更を聞くことができないため、ここでサービスを使用したいと思います。

于 2012-10-19T13:02:09.647 に答える
1

私の意見では、それはあなたがどれだけの仕事をしたいかによると思います。

ブロードキャストを受信したときに何か小さなことをしたい場合は、 のonReceive()メソッドで実行できますBroadcastReceiver。ただし、onReceive()メイン アプリケーション スレッドで呼び出されます。そのため、時間がかかりすぎると Android OS が強制終了します。

したがって、時間がかかる可能性があることを実行したい場合はService、バックグラウンド スレッドで実行する必要があります。onStart()提案されたように、コードをサービスのメソッドに入れることができます。何もしない場合は、サービスを実行し続けないでください (バッテリーやその他のリソースの無駄)。ブロードキャストを受信するたびにサービスを開始し、割り当てられたジョブが完了したらすぐに終了します。

PS Mark L. Murphy (別名 CommonsWare) には、Android 開発に関する優れた書籍がいくつかあります。Google Busy Coder のガイド Android 開発。

アップデート:

アプリケーションがバックグラウンドになったときにバックグラウンド タスクをキャンセルしたいという要望について。

バックグラウンド タスクが途中で中断された場合の対処方法を検討してください。この状況に対処する必要があります。それで問題なければ、AsyncTaskまたはServiceを使用してバックグラウンドでタスクを実行できます。どちらを選択するかは、タスクのサイズとタイプによって異なります。

AsyncTask通常、バックグラウンド操作を実行し、UI スレッドで結果を公開することを目的としています。Android のドキュメントでは、 のタスクは数秒を超えてはならないことが示唆されています。AsyncTask一方、ServiceUI との通信なしで長時間の操作を実行するように設計されています。

キャンセルについて。AsyncTaskUI スレッドに負担がかかるため、アクティビティが終了するとキャンセルされます。サービスを停止するにはstopService()、アクティビティから呼び出す必要があります。

位置情報を頻繁に保存する必要があるため、アクティビティの開始時にサービスを開始し、サービスのonBind()メソッドを使用して通信し、アクティビティのメソッドでサービスを停止することができonPause()ます。

于 2012-10-19T20:02:31.997 に答える