事は、ということですOSは優先度が低いとみなされるため、バックグラウンドサービスを強制終了し、その後、一定の間隔で再起動します。これはサービスを再開する前に時間の長さを増やすたびに何度か何度も何度も起こることがあります(一部の電話機は設定時間を使用しますが、増分はありません)。
私の提案は、あなたが常にサービスにしたい場合、あなたはforeground serviceにそれを作るために必要があるということです。これを実装する方法のコード例をいくつか挙げておきますが、私はXamarinについてよく知らないので、悪い例を与えたくありません。
AlarmManagerとPendingIntentを使用して、サービスが実行されているかどうかを確認し、サービスが実行されていないかどうかを確認する方法もあります。これをあまりにも頻繁に行うと、電池の消耗が顕著になることがありますが、十分に頻繁に行なわなければ、ジオフェンスのイベントを逃してしまう可能性があります。
は、この情報がお役に立てば幸いです、と幸運を!ここ
更新#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が取るべきルートで、おそらく最も簡単なものです。
ありがとうございました。私は、Androidでしばらくしてバックグラウンドサービスがシステムによって停止されることを完全に認識していませんでした。あなたはインテントが停止したときを検出してそれに対処する方法があると思いますか?ああ、簡単にJavaサンプルを与えることができます.Xamarinとは実際には異なる言語ではなく、異なる構文です(C#コードでマニフェストオプションが定義され、コンパイラがマニフェストXMLを処理します)。 – zezioen
サービスを停止するには、それを確認するプロセスが必要になりますが、これもまた殺される可能性があり、正方形に戻ることができます。フォアグラウンドサービスとサービスを定期的に再起動するアラームマネージャのコードサンプルを使用して自分の回答を更新しました。これがあなたのために働くことを望みます! –