Android實(shí)現(xiàn)Service下載文件,Notification顯示下載進(jìn)度的示例
先放個(gè)gif。。最終效果如果:

主要演示了Android從服務(wù)器下載文件,調(diào)用Notification顯示下載進(jìn)度,并且在下載完畢以后點(diǎn)擊通知會(huì)跳轉(zhuǎn)到安裝APK的界面,演示是在真實(shí)的網(wǎng)絡(luò)環(huán)境中使用真實(shí)的URL進(jìn)行演示,來(lái)看看代碼:
MainActivity代碼非常簡(jiǎn)單,就是啟動(dòng)一個(gè)Service:
public class MainActivity extends AppCompatActivity {
String download_url="http://shouji.360tpcdn.com/160329/a9037075b8d3aa98fbf6115c54a5b895/com.alensw.PicFolder_4722404.apk";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void bt_start_service(View view){
Intent intent=new Intent(this,DownLoadService.class);
intent.putExtra("download_url",download_url);
startService(intent);
}
}
DownLoadService里面,在onStartCommand方法里面是關(guān)鍵代碼,調(diào)用NotifyUtil這個(gè)工具類的“notify_progress”方法去顯示一個(gè)通知,與此同時(shí)開(kāi)始下載APK文件,DownLoadService代碼如下:
public class DownLoadService extends Service {
String download_url;
String savePath= Environment.getExternalStorageDirectory()+"/liulan.apk";
private int requestCode = (int) SystemClock.uptimeMillis();
private NotifyUtil currentNotify;
File mFile;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mFile=new File(savePath);
download_url=intent.getStringExtra("download_url");
Log.e("test","執(zhí)行onStartCommand");
//設(shè)置想要展示的數(shù)據(jù)內(nèi)容
Intent intent_noti = new Intent();
intent_noti.setAction(Intent.ACTION_VIEW);
//文件的類型,從tomcat里面找
intent_noti.setDataAndType(Uri.fromFile(mFile), "application/vnd.android.package-archive");
PendingIntent rightPendIntent = PendingIntent.getActivity(this,
requestCode, intent_noti, PendingIntent.FLAG_UPDATE_CURRENT);
int smallIcon = R.drawable.xc_smaillicon;
String ticker = "正在更新快圖瀏覽";
//實(shí)例化工具類,并且調(diào)用接口
NotifyUtil notify7 = new NotifyUtil(this, 7);
notify7.notify_progress(rightPendIntent, smallIcon, ticker, "快圖瀏覽升級(jí)程序", "正在下載中",
false, false, false, download_url, savePath, new NotifyUtil.DownLoadListener() {
@Override
public void OnSuccess(File file) {
mFile=file;
DownLoadService.this.stopSelf();
}
@Override
public void onFailure(Throwable t, int errorNo, String strMsg) {
}
});
currentNotify = notify7;
return super.onStartCommand(intent, flags, startId);
}
}
在調(diào)用“notify_progress”方法的時(shí)候,已經(jīng)開(kāi)始下載文件了,那么下載的代碼是什么呢?如下:
public void notify_progress(PendingIntent pendingIntent, int smallIcon,
String ticker, String title, String content,
boolean sound, boolean vibrate, boolean lights,
String download_url, String savePath, final DownLoadListener listener) {
setCompatBuilder(pendingIntent, smallIcon, ticker, title, content, sound, vibrate, lights);
/*
* 因?yàn)檫M(jìn)度條要實(shí)時(shí)更新通知欄也就說(shuō)要不斷的發(fā)送新的提示,所以這里不建議開(kāi)啟通知聲音。
* 這里是作為范例,給大家講解下原理。所以發(fā)送通知后會(huì)聽(tīng)到多次的通知聲音。
*/
FinalHttp fh = new FinalHttp();
HttpHandler<File> httpHandler=fh.download(download_url, savePath, new AjaxCallBack<File>() {
@Override
public void onLoading(long count, long current) {
super.onLoading(count, current);
double a=count;
double b=current;
double currentPro=(double)((b/a)*100);
cBuilder.setProgress(100, (int)currentPro, false);
sent();
}
@Override
public void onSuccess(File file) {
super.onSuccess(file);
cBuilder.setContentText("下載完成").setProgress(0, 0, false);
sent();
listener.OnSuccess(file);
}
@Override
public void onFailure(Throwable t, int errorNo, String strMsg) {
super.onFailure(t, errorNo, strMsg);
listener.onFailure(t,errorNo,strMsg);
}
});
}
這里用到了afinal.jar
這個(gè)jar已經(jīng)封裝好下載的工具類,我們直接拿來(lái)用就行。下載成功之后會(huì)通過(guò)DownLoadListener這個(gè)接口回調(diào)到DownLoadService里面,最終運(yùn)行效果就如最上面那個(gè)gif動(dòng)態(tài)圖運(yùn)行效果一樣。
項(xiàng)目下載地址:點(diǎn)擊下載
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android 下載文件通知欄顯示進(jìn)度條功能的實(shí)例代碼
- Android中使用AsyncTask實(shí)現(xiàn)下載文件動(dòng)態(tài)更新進(jìn)度條功能
- android中實(shí)現(xiàn)OkHttp下載文件并帶進(jìn)度條
- android實(shí)現(xiàn)多線程下載文件(支持暫停、取消、斷點(diǎn)續(xù)傳)
- 使用Android系統(tǒng)提供的DownloadManager來(lái)下載文件
- Android通過(guò)SOCKET下載文件的方法
- Android實(shí)現(xiàn)多線程下載文件的方法
- Android實(shí)現(xiàn)下載文件功能的方法
- Android使用Handler實(shí)現(xiàn)下載文件功能
相關(guān)文章
Android自定義View實(shí)現(xiàn)顏色選取器
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)顏色選取器 ,類似SeekBar的方式通過(guò)滑動(dòng)選擇顏色,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
Android 中為什么要用Fragment.setArguments(Bundle bundle)來(lái)傳遞參數(shù)
這篇文章主要介紹了Android 中為什么要用Fragment.setArguments(Bundle bundle)來(lái)傳遞參數(shù),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01
Android內(nèi)容提供者ContentProvider用法實(shí)例分析
這篇文章主要介紹了Android內(nèi)容提供者ContentProvider用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了內(nèi)容提供者ContentProvider獲取及解析數(shù)據(jù)的相關(guān)技巧,需要的朋友可以參考下2016-03-03
Android中NavigationView的使用與相關(guān)問(wèn)題解決
大家都知道NavigationView的引入讓 Android側(cè)邊欄實(shí)現(xiàn)起來(lái)相當(dāng)方便,最近公司項(xiàng)目中也使用這個(gè)新的控件完成了側(cè)邊欄的改版。在使用過(guò)程中遇到一些問(wèn)題所以記錄一下。本文分為兩個(gè)部分,一是基本使用,二是相關(guān)問(wèn)題的解決,感興趣的朋友們下面來(lái)一起看看吧。2016-10-10
Android 源碼淺析RecyclerView ItemAnimator
這篇文章主要為大家介紹了Android 源碼淺析RecyclerView ItemAnimator,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Android編程之簡(jiǎn)單計(jì)時(shí)器實(shí)現(xiàn)方法
這篇文章主要介紹了Android編程之簡(jiǎn)單計(jì)時(shí)器實(shí)現(xiàn)方法,涉及Android開(kāi)發(fā)中ContextMenu及Chronometer的相關(guān)使用技巧,需要的朋友可以參考下2016-01-01
Android進(jìn)階手寫(xiě)IPC通信框架告別繁瑣AIDL
這篇文章主要為大家介紹了Android進(jìn)階手寫(xiě)IPC通信框架告別繁瑣AIDL實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Android開(kāi)發(fā)Input系統(tǒng)觸摸事件分發(fā)
這篇文章主要為大家介紹了Android開(kāi)發(fā)Input系統(tǒng)觸摸事件分發(fā)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Android自定義雙向進(jìn)度條的實(shí)現(xiàn)代碼
本篇文章主要介紹了Android自定義雙向進(jìn)度條的實(shí)現(xiàn)代碼,非常具有實(shí)用的價(jià)值,有興趣的同學(xué)一起來(lái)了解一下2017-09-09
Android 獲取傳感器列表整理及簡(jiǎn)單實(shí)例
這篇文章主要介紹了Android 獲取傳感器列表整理及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06

