android后台时不显示,Android后台下载问题
下載任務顯然需要在主線程之外處理。
而從當前執行下載任務的activity按了返回鍵,然后再次進入后,該activity已經被銷毀并且重建了,并且一般情況下,在activity被銷毀后,我們應該清理新建的線程,以避免無法預料的后果。所以activity重建后顯示當前下載信息的各種UI組件也就無法顯示正確的狀態了。
而Service與UI無關,可以在后臺長時間運行;Bound service 更是允許 app 組件和 service 溝通:發送請求(比如下載請求)、獲取狀態(比如下載進度)。
所以,一種可行的解決辦法是:
AsyncTask 負責另起一個線程下載,并且定義一個接口,實現該接口就可以獲得下載進度及其它下載信息。
Bound Service 負責在后臺啟動 AsyncTask,并且管理該下載任務;實現 AsyncTask 定義的接口,把獲取的下載信息以廣播的形式發送出去;
Activity 在綁定到 service 后,就可以通過 service 啟動一個下載任務;然后實現一個 broadcast receiver,接收下載信息并更新UI.
如果對service不了解,可以點這里鏈接1;對綁定也不了解,可以點這里鏈接2。
AsyncTask負責另起一個線程下載
public class DownloadTask extends AsyncTask {
// 維護下載大小、下載進度、下載速率等信息。
private long downloadPercent;
// 構造器,指定下載的url和存儲路徑。
public DownloadTask(Context context, String url, String path);
@Override
protected Long doInBackground(Void... params) {
// 根據獲取的url,執行下載任務。
}
@Override
protected void onProgressUpdate(Integer... progress) {
// 定義一個callback,實現該callback的即可獲得進度的更新。
if (listener != null)
listener.updateProcess(this);
}
Bound Service負責在后臺啟動AsyncTask,并管理下載任務
public class DownloadService extends Service {
// Activity綁定該service后,就可以調用這個方法啟動一個下載任務。
public void startDownloadTask(String url) {
DownloadTask task = newDownloadTask(url);
task.execute();
}
private DownloadTask newDownloadTask(String url) throws MalformedURLException {
// 實現該接口就可以獲得下載進度及其它下載信息,然后以廣播的形式把獲取的信息發送出去。
DownloadTaskListener taskListener = new DownloadTaskListener() {
@Override
public void updateProcess(DownloadTask task) {
Intent updateIntent = new Intent(ACTION_DOWNLOADING_STATUS);
updateIntent.putExtra(MyIntents.PROCESS_PROGRESS, task.getDownloadPercent());
sendBroadcast(updateIntent);
}
};
return new DownloadTask(this, url, /path/to/store/, taskListener);
}
}
Activity負責綁定service,實現一個 broadcast receiver,接收下載信息并更新UI
public class DownloadActivity extends FragmentActivity {
// 在onStart中綁定service,注冊receiver
protected void onStart();
// 在onStop中取消綁定,取消注冊receiver
protected void onStop();
// 實現一個ServiceConnection,在onServiceConnected()回調方法中獲取service
private ServiceConnection mConnection = new ServiceConnection() {}
// 實現一個BroadcastReceiver,在onReceive()回調方法中獲取intent,從中解析下載信息然后更新UI.
private BroadcastReceiver mDownloadingStatusReceiver = new BroadcastReceiver() {}
// 獲取service后,就可以啟動一個下載任務了。
mService.startDownloadTask(URL);
}
完整的代碼可以從這里獲取 https://github.com/li2/DownloadDemo
這僅僅是一個demo,用于演示bound service和async task是如何實現后臺下載任務的。
該Demo從這個項目里yingyixu/android-download-manager (1) 借用了核心代碼;(2) 使用 Binder class實現service,代替原工程中使用的AIDL方式(因為該方式實現復雜,而Binder已經可以滿足你的需求,而且容易理解);(3) 刪除了管理多個下載任務的代碼。
建議了解實現方法后,直接使用第三方框架。
總結
以上是生活随笔為你收集整理的android后台时不显示,Android后台下载问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拳皇97如何开始游戏(拳皇97怎么开始游
- 下一篇: Android内存管理机制详解,【安卓知