現在、Android 位置追跡アプリ用のシンプルな mono のテスト段階にあります。アプリケーションは監視する「エンティティ」を選択し、ILocationListener クラスを継承するサービスを開始します。シンプルなタイマー オブジェクトを使用して、緯度/経度情報を 3 秒ごとに Web API サービスに送信します。その後、アプリは電話のバックグラウンドで待機し、舞台裏で GPS から位置情報を追跡します。
私たちが抱えている問題は、不確定な時間 (15 分、場合によっては 8 時間) が経過した後、アプリケーションがバックグラウンドで追跡を停止し、その理由を見つけるのに非常に苦労していることです。アプリケーションを開くときの動作はさまざまです。アプリケーションが単に再起動する場合もあれば、UI が停止したかのように黒い画面が表示される場合もあります。現在のテスト デバイスは Samsung Galaxy 3 ですが、Samsung Ace 2 も使用して同じ結果が得られました。
以下のコードは、ナット シェル内のバックグラウンド トラッキング コードです。このエラーを非常に厄介なものにしている実際のエラーの詳細を取得できていません。バックグラウンドでクラッシュする理由についてさらに情報が見つかった場合は、それがメモリの問題であろうと UI のストールであろうと、提供します。
public override void OnCreate()
{
base.OnCreate();
BusTimer = new System.Timers.Timer(3000);
BusTimer.Elapsed += OnTimeEvent;
isTracking = false;
StartTracking();
BusTimer.Start();
}
public void StartTracking()
{
if (SystemProperties.EntityTrackingID == 0 && SystemProperties.EntityTrackingType != "Track Me")
{
return;
}
isTracking = true;
//SETUP THE LOCATION VARIALBES
if (_geocoder == null) {
_geocoder = new Geocoder(this);
}
if (_locationManager == null)
{
_locationManager = (LocationManager)GetSystemService(LocationService);
}
var criteria = new Criteria() { Accuracy = Accuracy.Fine };
string bestProvider = _locationManager.GetBestProvider(criteria, true);
currentLocation = _locationManager.GetLastKnownLocation(bestProvider);
_locationManager.RequestLocationUpdates(bestProvider, 3000, 1, this);
}
private void OnTimeEvent(object source, ElapsedEventArgs e)
{
//LOG RECORD FOR CURRENT LOCATION
if (currentLocation != null && isTracking)
{
PostData(currentLocation, DateTime.Now);
}
}