システムに問題があります。私は常に位置をチェックし、ユーザーが開始してからの距離と時間をカウントするサービスを実行しています。しかし、20 ~ 25 分後、他のアプリケーション サービスとの多くの対話が強制終了されます。
どうすれば防ぐことができますか?
私は私の命を維持する 2 番目のサービスを追加することを考えています。
これがうまくいくかどうかはわかりませんが、これが私がそれを実装した方法です:
私の場合、X 分ごとにバックグラウンドで実行し続けるサービスが必要でした。サービスがシャットダウンされるたびに (メモリ使用量またはメイン アクティビティがバックグラウンドになり、Android がクリーンアップするため)、次のときに再度トリガーされます。時間間隔に達します。次のコンポーネントとワークフローがありました。
アクティビティの onCreate メソッドは、次のようにPendingIntentを作成し、それ自体とサービス S を渡します。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Create an IntentSender that will launch our service, to be scheduled
// with the alarm manager.
periodicIntentSender = PendingIntent.getService(
ActivityX.this, 0, new Intent(ActivityX.this, ServiceS.class), 0);
私のアクティビティでは、「 periodicIntentSender」(上記で定義)を引数として取り、ユーザー設定(connection_Interval)に基づいてインテントを送信するAlarmManagerを実装しています。
// Schedule the alarm to start
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(
AlarmManager.ELAPSED_REALTIME_WAKEUP, 0, connection_Interval, periodicIntentSender);
AlarmManager は、インテントが X 分ごとに送信されることを確認します。私のサービス S はこのインテントをリッスンし続け、そのようなインテントが送信されるたびにウェイクアップします。サービスが再びトリガーされるとすぐに、そのonHandleIntentメソッドが呼び出されます。
public class ServiceS extends IntentService implements LocationListener {
.
.
/*
* (non-Javadoc)
*
* @see android.app.IntentService#onHandleIntent(android.content.Intent)
*/
@Override
protected void onHandleIntent(Intent intent) {
<WHATEVER YOU NEED TO DO>
}
}
お役に立てれば。
しかし、20〜25分後、他のアプリケーションサービスとの多くのやり取りが停止されています。
ほとんどの場合、メモリ使用量が多すぎて、自動メモリマネージャがプロセスを強制終了したか、@AljoshaBreのように長時間実行された操作が原因である可能性があります。
どうすればそれを防ぐことができますか?
したがって、私の最初のアイデアはService
、たとえばでのライフサイクルメソッドで実行されているかどうかを確認することです。実行されonResume()
ていない場合は、を再起動Service
して再度実行する必要があります。
@Override
public void onCreate()
{
super.onCreate();
Notification notification = new Notification(R.drawable.icon_app_small, getText(R.string.app_name),System.currentTimeMillis());
Intent notificationIntent = new Intent(this, [yourService].class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(this, [name string], [notification msg string], pendingIntent);
startForeground(Notification.FLAG_ONGOING_EVENT, notification);
}