2

アプリを開いたとき、またはデバイスを起動したときに、特定の「長い」プロセスを実行するアプリがあります。

このプロセスは、ダウンロード マネージャーを介して一定量のダウンロードを実行し、プロセスが終了すると、ブロードキャスト イベントをアプリに送信して、分析をキャプチャします。

私が理解しているように、ブートブロードキャストイベントが呼び出されるたびに、Applicationクラスがインスタンス化されます (まだメモリにない場合)。

Applicationクラスは、ユーザーがアプリを開いたときにも開始されます。

それに基づいて、プロセスを実行するコードをクラスonCreateのメソッド内に配置します。Application(プロセスはそこから新しいスレッドを開始します)

ただし、「長い」プロセスは、ブート ブロードキャスト レシーバーの存続時間 (約 10 秒?) よりも長くかかっているように見えるため、アプリ プロセスは強制終了されます。それから数秒後、ダウンロードが完了した後、2 番目のブロードキャストが送信され、アプリが再び開始さApplication.onCreateれ、いくつかの望ましくない影響が生じます。

プロセスは、単一の直線的な方法で実行され、再度呼び出されることはないと予想されていましたonCreate

このプロセスは 1 回しか発生しないServiceため、アプリが存続するためにより多くの時間を与えるために を作成することを考えていました。ただし、プロセスは DownloadManager に依存するため、次のようになります。

1)リターンIntentService後にプロセスがまだ強制終了されているため、使用は機能しません(私が理解しているように) 。handleIntentプロセスは新しいスレッドを作成するため、そのタスクは非同期になり、handleIntentプロセス全体が終了する前にメソッドが戻ります。

2)Serviceしばらくの間単に「生きている」だけで、プロセスが終了した後に停止する を作成する必要がありますか?

3) 追加の質問として、実行中の がある場合ServiceApplicationクラスはインスタンス化され、サービスが停止するまでメモリに保持されますか?

4

2 に答える 2

1

これを 1 回だけ行う場合は、独自のService. アプリが起動したら、 を呼び出しますstartService()onStartCommand()で、必要な処理を実行して戻るServiceバックグラウンドを開始します(これにより、停止するまで実行が継続されます)。が完了したら、 を呼び出します。ThreadSTART_STICKYServiceThreadstopSelf()Service

もちろん、 を使用することもできますIntentServiceが、そのクラスは の拡張にすぎず、Service便利な別のレイヤーを提供します。IntentServiceバックグラウンド スレッドのプールを管理Serviceし、作業が不足した場合の の開始と停止を処理します。これは必要なものに対しておそらくやり過ぎですが、必要に応じて使用してください。ここでのトレードオフは無視できます。

注:何らかの理由で、多くの開発者は、、、および Event Bus<opinion>などの特定の「流行」ソリューションを好むようです。問題を解決する方法は他にもたくさんあります。ソフトウェア開発に「万能」というものはありません。AsyncTaskIntentService</opinion>

于 2016-12-22T07:14:12.157 に答える