私は定期的にユーザーの場所を取得する必要があります(60分ごとに探しています)。コードネーム1:Android Lollipopでバックグラウンドの場所リスナーが起動しない
フォアグラウンドロケーションリスナーを使い始めたのは完璧でした。数分おきに発生するようですが、十分な時間が経過すれば実際に場所を追跡できるようにチェックを入れました。私が他のアプリに切り替えると、フォアグラウンドリスナーが一定期間にわたって発砲し続け、発砲を止めるように見えます。なぜなら、OSがアプリケーションに戻ってきていると思っているからです。どの時点で、バックグラウンドリスナーが登録され、そのリスナーが解雇されたときにアプリケーションをスリープ状態にすることが予想されます。
私の質問に...バックグラウンドロケーションリスナーに問題があります。私はシミュレータで起動しないことを理解していますが、デバッグ(内蔵の証明書を使用)を自分のデバイスにビルドするときにも起動しません。この質問のために、私は、ここに挙げた例に基づいて、私のアプリがベアボーンに行っていることを掘り下げました:https://gist.github.com/shannah/86c739edac34216d3c4d
ちょうど私がバックグラウンドリスナーを標準フォアグラウンドのもの(.setLocationListener新しいBackgroundListener()))、そしてシミュレータ上で実行すると、自分のラベルが適切なデータで更新されることを確認できます。
また、実際のアプリケーションでいくつかのテストを行いました。そこでは、引数なしのコンストラクタでリスナーが初期化されたことを示すダイアログが表示され、locationUpdatedが呼び出されたときに別のダイアログが表示されます。私はinitでポップアップを見ることができましたが、locationUpdatedのダイアログは表示されず、私のデバイスは決してそれを起動していないと信じられました。
私がテストしているデバイスは、Android 5.0.1(Lollipop)を搭載したSamsung S4です。
私の実際のアプリケーションが行っていることとよく似たテストアプリケーションです。
bglocation.java
package com.bglocation;
import java.util.List;
import com.codename1.io.Storage;
import com.codename1.location.LocationManager;
import com.codename1.ui.Display;
import com.codename1.ui.Form;
import com.codename1.ui.Label;
import com.codename1.ui.plaf.UIManager;
import com.codename1.ui.util.Resources;
/**
* This file was generated by <a href="https://www.codenameone.com/">Codename One</a> for the purpose
* of building native mobile applications using Java.
*/
public class bglocation {
private Form current;
private Resources theme;
public void init(Object context) {
theme = UIManager.initFirstTheme("/theme");
}
public void start() {
if(current != null){
current.show();
return;
}
Form hi = new Form("Hi World");
LocationManager.getLocationManager().setBackgroundLocationListener(BackgroundLocationListener.class);
String lastCheckin = (String)Storage.getInstance().readObject("LOCATION");
String label = "No checkins.";
if (lastCheckin != null) {
label = lastCheckin;
}
Label hiLabel = new Label("Last checkin: " + label);
hi.addComponent(hiLabel);
hi.show();
}
public void stop() {
current = Display.getInstance().getCurrent();
}
public void destroy() {
}
}
重要な場所の変更があった後、バックグラウンドリスナーが呼び出されるBackgroundLocationListener.java
package com.bglocation;
import java.util.Date;
import com.codename1.io.Storage;
import com.codename1.location.Location;
import com.codename1.location.LocationListener;
public class BackgroundLocationListener implements LocationListener {
@Override
public void locationUpdated(Location location) {
Storage.getInstance().writeObject("LOCATION", new Date().toString());
}
@Override
public void providerStateChanged(int newState) { }
}
重要な場所の変更をご希望ですか?また、私が受け取ったデータをどこに保管できるかについての制限はありますか? Storageクラスを使用して、アプリケーションのファイルを格納する場所のどこにでもファイルを書き込もうとしています。そのため、Listenerとアプリケーションの両方からアクセス可能であると想定しています。 –
Android上でバックグラウンドリクエストが10秒間隔で定義され、50メートルが変更されると、iOS上でデバイスが関連するセルタワーの変更を検出したことを意味する重要なロケーション変更コールバックにマッピングされます – Chen
私の元の投稿リスナーがストレージに書き込むだけで、start()(これはアプリケーションが一時停止したときに呼び出されます)では同じ場所から読み込み、それでもまだ機能していません。 新しいビルドを作成してデバイスにプッシュしました。アプリが停止していないことを確認しました(実行中のアプリケーションを表示するためにホームボタンを押して確認しました)。私は今日3回、私が仕事に出かける前に(仕事から15キロ離れた)仕事に出て、家に帰って再び強制終了/再開してもラベルは更新されませんでした。 –