2016-07-25 5 views
0

でiOSとAndroidの上のGPSイベントを通じてアプリを起動します私たちが望むやり方で行動します。この自動システムは、1日か2日は使用できなくなってからOSによってオフになっているようです(その間に電話機は動かず、基本的にはテスト用にのみ使用されます)。は自動的に我々はユーザーが仕事にしてから作るのルートを追跡するアプリを作成したと我々は自動記録機能を持っているで構築するが、それはない仕事でXamarin.Forms

iOSでは、CLRegionsを使用してユーザーの現在地を囲む2つの領域を作成しています。異なる半径を持つユーザーの正確な場所に5つの領域が作成され、 10メートル(半径80メートル)。 CLLocationManagerオブジェクトには、重大な変更と訪問の監視を開始するように指示されています(これらはまだ1度も起動されていません)。 Androidの上で

我々はLocationServices APIを介してジオフェンスを使用していて、ここでは、ユーザの現在位置の周りの5つのインクリメンタル半径を持っています。ユーザーがAndroidでアプリケーションを終了したり、電話を再起動したりすると、ジオフェンスを再初期化して監視を開始するバックグラウンドサービスが開始されます。私は外に少し歩いて、それらをテストしていたときに

両方のシステムが本当にうまく動作しますが、それは彼らが動作を停止(週末別名)不活動の一日か二日後のように思えます。私はかなり長い間これをデバッグしてきましたが、それがまだ良くなっていますが、まだ完全ではありません。

は、ジオフェンス/領域はアプリがオフになっている時間の長さに関係なくトリガされたときに自動的にバックグラウンドでアプリを起動する信頼性の高いシステムを持っている、それも可能ですか?私は両方のOSのバックグラウンドタスクを処理する方法が非常に異なっていることを知っていますが、このようにGPS使用の長期的な制限についてはあまりよく分かりません。 Androidのサービスと

私たちが作っているアプリはXamarinフォームで書かれているが、これらのシステムは、そのネイティブプロジェクト(まだC#で​​なく、全体のネイティブプラットフォームへのフルアクセス)に書かれている

答えて

0

事は、ということですOSは優先度が低いとみなされるため、バックグラウンドサービスを強制終了し、その後、一定の間隔で再起動します。これはサービスを再開する前に時間の長さを増やすたびに何度か何度も何度も起こることがあります(一部の電話機は設定時間を使用しますが、増分はありません)。

私の提案は、あなたが常にサービスにしたい場合、あなたはforeground serviceにそれを作るために必要があるということです。これを実装する方法のコード例をいくつか挙げておきますが、私はXamarinについてよく知らないので、悪い例を与えたくありません。

AlarmManagerPendingIntentを使用して、サービスが実行されているかどうかを確認し、サービスが実行されていないかどうかを確認する方法もあります。これをあまりにも頻繁に行うと、電池の消耗が顕著になることがありますが、十分に頻繁に行なわなければ、ジオフェンスのイベントを逃してしまう可能性があります。

は、この情報がお役に立てば幸いです、と幸運を!ここ

更新#1

フォアグラウンドでサービスを有するAlarmManagerを実行して、両方のコードサンプルです。

フォアグラウンド

これは正しく生きているあなたのアプリを保つための最も簡単な方法です。

public class ForegroundService extends Service{ 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId){ 
     Notification notification = new NotificationCompat.Builder(this) 
       .setSmallIcon(R.mipmap.icon) 
       .setContentTitle("TITLE") 
       .setContentText("This is an example notification!") 
       .build(); 
     startForeground(ID, notification); 
     //Do your stuff here 
    } 

    @Override 
    public void onDestroy(){ 
     super.onDestroy(); 
     stopForeground(true); 
     //If you have anything else you want done here... 
    } 
} 

AlarmManager

これは継続的にあなたが(この例では10分)に設定した間隔でこのサービスを作成しようとします。ここにはいくつかの落とし穴があります。まず、Android 6.0でDozeモードが導入されているため、電話がスリープしている間にAlarmManagerが起動しないことがあります。これは、サービスがかなり長時間にわたって停止している可能性があることを意味します。第二に、これは何度もonStartCommand関数を呼び出すため、それを処理するロジックが必要です。これら両者の

public class AlwaysOnService extends Service{ 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId){ 

     AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); 
     PendingIntent pi = PendingIntent.getService(this, requestCode, new Intent(this, AlwaysOnService.class), PendingIntent.FLAG_UPDATE_CURRENT); 
     am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + MIN_10_IN_MILLIS, pi); 
     //Do your stuff here 
     return START_STICKY; 
    } 

    @Override 
    public void onDestroy(){ 
     super.onDestroy(); 
     AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); 
     PendingIntent pi = PendingIntent.getService(this, requestCode, new Intent(this, AlwaysOnService.class), PendingIntent.FLAG_NO_CREATE); 
     if(pi != null){ 
      am.cancel(pi); 
      pi.cancel(); 
     } 
     //If you have anything else you want done here... 
    } 
} 

、フォアグラウンドサービスとしてサービスを設定すると、あなたが本当にそれを持つことができない場合を除き、その後、AlarmManagerが取るべきルートで、おそらく最も簡単なものです。

+0

ありがとうございました。私は、Androidでしばらくしてバックグラウンドサービスがシステムによって停止されることを完全に認識していませんでした。あなたはインテントが停止したときを検出してそれに対処する方法があると思いますか?ああ、簡単にJavaサンプルを与えることができます.Xamarinとは実際には異なる言語ではなく、異なる構文です(C#コードでマニフェストオプションが定義され、コンパイラがマニフェストXMLを処理します)。 – zezioen

+0

サービスを停止するには、それを確認するプロセスが必要になりますが、これもまた殺される可能性があり、正方形に戻ることができます。フォアグラウンドサービスとサービスを定期的に再起動するアラームマネージャのコードサンプルを使用して自分の回答を更新しました。これがあなたのために働くことを望みます! –

関連する問題