17

長時間実行されるサービスを強制終了する OS に対処する方法について、いくつかのガイダンスをいただければ幸いです。

ビジネス シナリオ:

アプリケーションは、数時間続く可能性のある BTT トラックを記録します。また、関連する統計情報とともにトラックを地図上に表示することもできます。

アプリケーションのユーザー インターフェイスにより、ユーザーはトラックの記録を開始/停止し、マップ上でリアルタイムのトラックを表示できます。

トラックの記録を開始した後、ユーザーはアプリケーションを終了して画面をオフにすることができます (電力を節約するため)。ユーザーがアクティビティを再開して記録の停止を要求するまで、データベースへの記録の更新を保持するサービスのみが実行されます (通知が表示されます)。となり、サービスが終了します。

問題:

40 分から 1 時間半までのさまざまな時間が経過すると、記録サービスは警告なしに強制終了されます。BTT の外出には数時間かかる場合があるため、トラックの録音が不完全になることがあります。

いくつかの追加情報:

サービスは で開始されSTART_STICKY、 を取得しPARTIAL_WAKE_LOCK、メイン アクティビティと同じプロセスで実行されます。

新しい場所は、1 秒から数分までのユーザー定義の速度で取得 (および記録) されます。Android のドキュメントから、これが長時間実行されるサービスの予期される OS の動作であることを知っています。

質問:

ビジネス シナリオの要件を満たすことができる適切に動作するアプリケーションを作成するための最適なアーキテクチャ設計アプローチは何ですか?

私はいくつかのオプションを考えることができます(そして私はそれらのどれも好きではありません)が、すでに同様の問題に直面して解決した方法について誰かからのガイダンスが欲しいです:

  • ブロードキャスト レシーバー (可能であれば Location Manager に接続するのが理想的) を使用して、新しい場所が取得されたときにのみサービスを実行しますか?
  • ユーザーがメイン アクティビティから離れられないようにします (その結果、ユーザー エクスペリエンスが低下します)。
  • 必要に応じて、アラーム ブロードキャスト受信機でサービスを再起動しますか?

この件について知恵を共有できるすべての人に感謝します。

4

1 に答える 1

9

私は非常に似たようなことをするアプリを持っています。サービスをフォアグラウンド タスクにすることで、サービスが継続して実行されるようにします。実行を開始する準備ができたら、次の関数を呼び出します。これにより、通知も設定されます。

void fg() {
    Notification notification = new Notification(R.drawable.logstatus, 
                    "Logging On", System.currentTimeMillis());
    Intent notificationIntent = new Intent(this, LoggerActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, 
                    notificationIntent, 0);
    notification.setLatestEventInfo(this, "Logger","Logger Running",
                pendingIntent);
    startForeground(1, notification);   
}

ロギングが終了したら、フォアグラウンド モードを終了します。

stopForeground(true);
于 2012-10-02T15:13:18.633 に答える