2

ベースのアプリが動作していGPSます。多くのアクティビティがあり、すべてがGPS. たとえば、あるアクティビティはある場所までの距離を示し、別のアクティビティは速度と方向を示します。私はセットアップして電話requestLocationUpdates()をかけonCreate()、電話をかけremoveUpdates()ますonPause()

これはすべて機能しますが、GPSアクティビティを切り替えるときに点滅し、再取得する必要があります。私はテストを行いましたがremoveUpdates()onStop()代わりにを入れてonPause()も点滅はありません。どうやらonStop()新しいアクティビティが開始された後に呼び出され、まばたきの欠如を説明しています。

この件に関する投稿を読みましたが、意見の相違があるようです。ただし、使用する必要があるようで、使用onStop()しない理由があるかどうか疑問に思っています。

2 番目の問題は、onResume()コードがないためGPS、戻る矢印の後に、または画面のオフとオンの後にがないことです。これを修正する必要があります。現在、私のonCreate()コードはロケーションマネージャーを作成し、基本的にすべてのコードをその中に含んでいます。removeUpdates()を onStop に移動し、lm と ll の作成を に移動する必要があるライフ サイクル フローチャートに従うように見えますonStart()。これは正しいです?

これが私のonCreate()コードです:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.set);
    textView1 = (TextView)findViewById(R.id.textView1);
    lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    ll = new mylocationlistener();
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);
}

ここに私のonPauseコードがあります:

    @Override
    protected void onPause() {
        super.onPause();
        if(lm != null) {
            lm.removeUpdates(ll);
        }
        ll = null;
        lm = null;
    }

したがって、onPause() を onStop() に変更し、onStart() を次のようにする必要があると思います。

@Override
public void onStart() {
    super.onStart();
    lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    ll = new mylocationlistener();
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);
}

そして、私のonCreateコードは次のとおりです。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.set);
    textView1 = (TextView)findViewById(R.id.textView1);
  }

これは、私はこれらすべてに不慣れで、これが私の最初のアプリケーションであるため、ここで何が欠けているかを知りたいと言いました.

4

3 に答える 3

7

アクティビティがバインドされていないときに GPS を停止し、アクティビティがバインドされたときに GPS を開始するサービスに GPS 機能を委任したことを除いて、アプリと同様のことを行いました。onStarts でサービスにバインドし、onStops でアンバインドします。アクティビティを切り替えるときに on.. メソッドをログに記録すると、次のようなシーケンスが得られます。

FIRST Activity onCreate
FIRST Activity onStart
FIRST Activity onResume
FIRST Activity onPause
SECOND Activity onCreate
SECOND Activity onStart
SECOND Activity onResume
FIRST Activity onStop

制御する LocationManager が 1 つだけになるようにサービスを介して実行した場合は、同じアプローチを取るか、onStarts() で requestUpdates を実行し、onStops() でそれらを削除することができます。

于 2012-07-27T17:42:55.443 に答える
1

まず第一に、ロケーション戦略についてよく読んでおくことをお勧めします。

1回限りの位置情報の修正が必要な場合は、ユーザーがアクティビティを切り替えるよりもGPS位置の取得に時間がかかる可能性があるため、アクティビティのライフサイクルから少し独立させる必要があります。

したがって、onPauseまたはonStopでリクエストを停止しないでください。Applicationオブジェクトでシングルトンインスタンスとして機能する特別な場所クエリハンドラーを使用できます(そのためのApplicationの派生物を作成します)。

たとえば、アクティビティのonStartメソッドまたはonResumeメソッドで必要に応じて、そのロケーションハンドラに新しい修正を取得するように指示します。ハンドラーに、必要に応じてすぐに使用できる最新かつ最適な位置データを保持させます。

NETWORK_PROVIDERの場所は、GPSよりも高速である必要があり、正確ではない場合でもすぐに操作できるため、初めてクエリを実行できます。その上、ユーザーがGPSモジュールをオフにした場合に備えて場所も取得します。

ただし、それは結果がどれだけ正確でなければならないかに依存します。GPSの位置を照会し、その結果が来るのを待つローカルサービスを作成することもできます。結果が表示されたら、ローカルブロードキャストインテントを介して現在実行中のアクティビティを通知できます。

いずれの場合も、locationManager.getLastKnownLocationを使用して最後の既知の場所を取得できます

于 2012-07-27T17:39:16.693 に答える
0

まず、私はあなたがここでどのような質問をしているのか100%ではありませんが、私はあなたを助けようとします。 OnPauseアクティビティがフォーカスを失うたびに呼び出されます。これは主にポップアップなどのためであり、アクティビティはバックグラウンドになりますが、ぼやけます。 OnStop新しいアクティビティが開始されるたびに呼び出されます。位置検索コードをに入れる必要がありますOnResumeOnResumeアプリケーションが再開するたびに呼び出されます。これには、OnCreateまたはへの呼び出しが含まれますOnStartlm.removeUpdates(ll);ロジックもOnStopに配置する必要があります。これは、ライフサイクルでの位置検索のための一般的に受け入れられている方法です。セミコロンで文を終えたところです...コーディングしすぎています。

于 2012-07-27T17:56:24.027 に答える