2016-04-26 7 views
2

Androidアプリがフォーカスをもたなくても、バックグラウンドで実行されるようにするにはどうすればよいですか?ここで起こるのは、中断された後(たとえば、メッセージが到着した後)、そしてそれがフォーカスを戻すと、中断のポイントまで処理したものと一緒にそこに座るだけです。おそらく私のデザインは、それが中断されたところから再開されるという明白な方法を見ることができないので、あまりうまくいきません。 (設計の理由の1つは、実行時間の長いクエリの出力が、最後にすべてではなく中間結果をすぐに与えることが不可欠であるということです)。Androidアプリがフォーカスを持たない状態で、どのように動作させ続けるのですか?

私は別のアプリケーションに切り替えることもできます私のアプリケーションの処理を保つ。私はそれが上記と同じ状況になると思います。

グーグルは、アプリの実行を保つための方法としてserviceを上げますが、ユーザーは自分のアプリケーションの場合のアプリと対話しなければならない場合は、1本のヒットは、これを実行しないように提案しました。

私は自分のデータベースを作成していない1 Asynctaskにを使用します(一度、何ら問題は、これまでに割り込みが発生した場合 - 私はちょうど中断さから読み込みを続け、次の実行上)と、別のAsyncTaskクエリそれをに(これは可能非常に長時間にわたるタスク)が、このアプローチではアプリをバックグラウンドで実行することはできません。中断すると、出力画面が不完全で死んだり、ユーザーの入力画面にフォーカスが戻ったりします。 serviceクエリ機能(現在はAsyncTask)を変更

うが良いでしょ?それは実現可能ですか? (。ユーザーは、クエリの実行中のアプリと相互作用しない)

私は現在、次のプライベートクラスがあります。

private class DatabaseOpenHelper extends SQLiteOpenHelper

private class LoadDatabase extends AsyncTask<Object, Integer, Void>

private class QueryDB extends AsyncTask<Object, String, Void>

をご入力が認識されるであろう。

EDIT

最初に以下の回答Serviceを使用して動作することを示唆しています。

IntentServiceを拡張するとGoogleの仕事は簡単になると私は思っています。

ANOTHER EDIT

はい、IntentServiceは私がまさに必要です。 thisを参照してください。 AsyncTaskからIntentServiceに変更するのはかなり簡単です。

答えて

3

真のバックグラウンドタスクの場合、唯一の標準的な方法はサービスです。または、あなたのアプリを強制終了することができます。AsyncTaskと

問題:

  • 非静的内部クラスはメモリリークにつながることができます。
  • これはプロセスのライフサイクルに結びついています(ホストアクティビティではありません)。
  • killing list is lowの優先順位。

サービスを使用してブロードキャストメッセージを送信し、ユーザにフォーム通知を送信します。

注:デフォルトではサービスはUIスレッドで実行されるため、スレッド化を使用する必要があります。

IntentServiceはシリアルタスクでは問題ありません。複数の並列ジョブが必要な場合は、サービスを拡張します。

+0

- おねがいします。シリアルタスクOK。このコンテキストでスレッディングを使用する方法がわからない。いくつかのデスクトッププログラムでスレッドをうまく使用しているので、私はこのアプリケーションの 'service'を追求するために私を良い形にしていると思います。任意のチュートリアル/例を歓迎します。 – DSlomer64

+0

私は[first](http://www.vogella.com/tutorials/AndroidServices/article.html)を試してみます。 [google team](http://developer.android.com/training/run-background-service/create-service.html)の完全な例(ダウンロード[ThreadSample.zip](http://developer.android .com/shareables/training/ThreadSample.zip)) –

関連する問題