この更新サービスは、手がかりからデータをプル/ダウンロードします
サービスからダウンロード
ここでの大きな問題は、サービスからアクティビティを更新するにはどうすればよいかということです。次の例では、知らないかもしれない 2 つのクラス、ResultReceiver と IntentService を使用します。ResultReceiver は、サービスからスレッドを更新できるようにするものです。IntentService は、そこからバックグラウンド作業を行うスレッドを生成する Service のサブクラスです (Service は実際にはアプリの同じスレッドで実行されることを知っておく必要があります。Service を拡張するときは、新しいスレッドを手動で生成して CPU ブロッキング操作を実行する必要があります)。 .
ダウンロード サービスは次のようになります。
public class DownloadService extends IntentService {
public static final int UPDATE_PROGRESS = 8344;
public DownloadService() {
super("DownloadService");
}
@Override
protected void onHandleIntent(Intent intent) {
String urlToDownload = intent.getStringExtra("url");
ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver");
try {
URL url = new URL(urlToDownload);
URLConnection connection = url.openConnection();
connection.connect();
// this will be useful so that you can show a typical 0-100% progress bar
int fileLength = connection.getContentLength();
// download the file
InputStream input = new BufferedInputStream(url.openStream());
OutputStream output = new FileOutputStream("/sdcard/BarcodeScanner-debug.apk");
byte data[] = new byte[1024];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
total += count;
// publishing the progress....
Bundle resultData = new Bundle();
resultData.putInt("progress" ,(int) (total * 100 / fileLength));
receiver.send(UPDATE_PROGRESS, resultData);
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
} catch (IOException e) {
e.printStackTrace();
}
Bundle resultData = new Bundle();
resultData.putInt("progress" ,100);
receiver.send(UPDATE_PROGRESS, resultData);
}
}
サービスをマニフェストに追加します。
<service android:name=".DownloadService"/>
新しい更新がある場合は、GUI を更新する必要があります
アクティビティは次のようになります。
// 最初の例のように進行状況ダイアログを初期化します
// これがダウンローダを起動する方法です
mProgressDialog.show();
Intent intent = new Intent(this, DownloadService.class);
intent.putExtra("url", "url of the file to download");
intent.putExtra("receiver", new DownloadReceiver(new Handler()));
startService(intent);
ResultReceiver が機能するようになったのは次のとおりです。
private class DownloadReceiver extends ResultReceiver{
public DownloadReceiver(Handler handler) {
super(handler);
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
super.onReceiveResult(resultCode, resultData);
if (resultCode == DownloadService.UPDATE_PROGRESS) {
int progress = resultData.getInt("progress");
mProgressDialog.setProgress(progress);
if (progress == 100) {
mProgressDialog.dismiss();
}
}
}
}