IntentServices を使用することをお勧めします。
public class FileDownloader extends IntentService {
private static final String TAG = FileDownloader.class.getName();
public FileDownloader() {
super("FileDownloader");
}
@Override
protected void onHandleIntent(Intent intent) {
String fileName = intent.getStringExtra("Filename");
String folderPath = intent.getStringExtra("Path");
String callBackIntent = intent
.getStringExtra("CallbackString");
// Code for downloading
// When you want to update progress call the sendCallback method
}
private void sendCallback(String CallbackString, String path,
int progress) {
Intent i = new Intent(callBackIntent);
i.putExtra("Filepath", path);
i.putExtra("Progress", progress);
sendBroadcast(i);
}
}
次に、ファイルのダウンロードを開始するには、次のようにします。
Intent i = new Intent(context, FileDownloader.class);
i.putExtra("Path", folderpath);
i.putExtra("Filename", filename);
i.putExtra("CallbackString",
"progress_callback");
startService(i);
ここで、他のブロードキャストと同じように「progress_callback」コールバックを処理し、受信者を登録する必要があります。この例では、ファイルパスを使用して、進行状況のビジュアルを更新する必要があるファイルを決定します。
サービスをマニフェストに登録することを忘れないでください。
<service android:name="yourpackage.FileDownloader" />
ノート:
このソリューションを使用すると、各ファイルのサービスをすぐに開始し、各サービスが新しい進行状況を報告するときに着信ブロードキャストをさりげなく処理できます。次のファイルを開始する前に、各ファイルがダウンロードされるのを待つ必要はありません。ただし、ファイルを連続してダウンロードすることを主張する場合は、もちろん、100% 進行状況のコールバックを待ってから次のコールバックを呼び出すことができます。
「CallbackString」の使用
アクティビティで次のように使用できます。
private BroadcastReceiver receiver;
@Overrride
public void onCreate(Bundle savedInstanceState){
// your oncreate code
// starting the download service
Intent i = new Intent(context, FileDownloader.class);
i.putExtra("Path", folderpath);
i.putExtra("Filename", filename);
i.putExtra("CallbackString",
"progress_callback");
startService(i);
// register a receiver for callbacks
IntentFilter filter = new IntentFilter("progress_callback");
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//do something based on the intent's action
Bundle b = intent.getExtras();
String filepath = b.getString("Filepath");
int progress = b.getInt("Progress");
// could be used to update a progress bar or show info somewhere in the Activity
}
}
registerReceiver(receiver, filter);
}
メソッドでこれを実行することを忘れないでくださいonDestroy
:
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
「progress_callback」は、選択した他の文字列にすることができることに注意してください。
ブロードキャスト レシーバーをプログラムで登録するから借用したコード例