原文网址:http://www.obatu.com/android-service-download-notification-progressbar/
最近的项目中,有一个需求是 【后台下载+多线程+Notificaton进度条】的应用。要求有一个Service做下载服务,Notification中显示一进度条,进度条由Service来更新。
花了个把小时在网上找代码,没有一个完美的方案,最后根据片段信息,自己实现了。贴出来分享一下。
思路:
- 1. 有一个提供队列下载的Service
- 2. 该Service可以绑定,绑定的时候返回本身实例
- 3. 该Service提供方法给绑定了该Service的Activity,Activity可以调用Service的提供的方法,给Service添加队列
- 4. 该Service提供了当前下载队列的信息,信息包括下载的名称,下载进度,Activity通过接口读取队列信息用于操作,如:取消
实现:
1. 队列类
-
public class DownLoadQueue{
-
-
public int id;
-
-
public String name;
-
-
public int progress = 0;
-
-
public boolean isCancel = fale;
-
2. Service类:
-
public class DownloadService extends Service{
-
-
private Map<integer><span class="sh_normal"> </span>downLoadQueue<span class="sh_symbol">;</span> <span class="sh_comment">//下载队列,格式:</span><id><li>
<li>
<span class="sh_keyword">private</span> <span class="sh_usertype">Binder</span><span class="sh_normal"> </span>serviceBinder <span class="sh_symbol">=</span> <span class="sh_keyword">new</span> <span class="sh_function">DownLoadServiceBinder</span><span class="sh_symbol">();</span>
</li>
<li>
<li>
<span class="sh_comment">// Activity绑定后,会自动条用这个方法</span>
</li>
<li>@Override</li>
<li>
<span class="sh_keyword">public</span> <span class="sh_usertype">IBinder</span><span class="sh_normal"> </span><span class="sh_function">onBind</span><span class="sh_symbol">(</span><span class="sh_usertype">Intent</span><span class="sh_normal"> </span>intent<span class="sh_symbol">)</span>
</li>
<li>
<span class="sh_cbracket">{</span>
</li>
<li>Log<span class="sh_symbol">.</span><span class="sh_function">d</span><span class="sh_symbol">(</span><span class="sh_string">"DownloadService"</span><span class="sh_symbol">,</span> <span class="sh_string">"onBind"</span><span class="sh_symbol">);</span>
</li>
<li>
<span class="sh_keyword">return</span> serviceBinder<span class="sh_symbol">;</span>
</li>
<li>
<span class="sh_cbracket">}</span> </li>
<li>
<li>
<span class="sh_symbol">....</span>
</li>
<li>
<li>
<span class="sh_keyword">private</span> <span class="sh_type">void</span> <span class="sh_function">startDownLoad</span><span class="sh_symbol">(</span><span class="sh_usertype">DownLoadQueue</span><span class="sh_normal"> </span>queue<span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
</li>
<li>
<span class="sh_keyword">new</span> <span class="sh_function">Thread</span><span class="sh_symbol">()</span><span class="sh_cbracket">{</span>
</li>
<li>
<span class="sh_keyword">public</span> <span class="sh_type">void</span> <span class="sh_function">run</span><span class="sh_symbol">()</span><span class="sh_cbracket">{</span>
</li>
<li>
<span class="sh_comment">//进行下载工作,这里需要更新downLoadQueue中对应的queue的进度信息</span>
</li>
<li>
<span class="sh_comment">//使用Handler更新notification信息</span>
</li>
<li>
<span class="sh_symbol">....</span>
</li>
<li>
<span class="sh_cbracket">}</span>
</li>
<li>
<li>
<span class="sh_cbracket">}</span><span class="sh_symbol">.</span><span class="sh_function">start</span><span class="sh_symbol">();</span>
</li>
<li>
<span class="sh_cbracket">}</span>
</li>
<li>
<li>
<span class="sh_keyword">public</span> <span class="sh_type">void</span> <span class="sh_function">addQueue</span><span class="sh_symbol">(</span><span class="sh_usertype">DownLoadQueue</span><span class="sh_normal"> </span>queue<span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
</li>
<li>
<span class="sh_keyword">this</span><span class="sh_symbol">.</span>downLoadQueue<span class="sh_symbol">.</span><span class="sh_function">add</span><span class="sh_symbol">(</span>queue<span class="sh_symbol">.</span>id<span class="sh_symbol">,</span>queue<span class="sh_symbol">);</span>
</li>
<li>
<span class="sh_keyword">this</span><span class="sh_symbol">.</span><span class="sh_function">startDownLoad</span><span class="sh_symbol">(</span>queue<span class="sh_symbol">);</span>
</li>
<li>
<span class="sh_cbracket">}</span>
</li>
<li>
<li>
<span class="sh_keyword">public</span> <span class="sh_usertype">Map</span><integer><span class="sh_normal"> </span><span class="sh_function">getQueueList</span><span class="sh_symbol">()</span><span class="sh_cbracket">{</span><li>
<span class="sh_keyword">return</span> <span class="sh_keyword">this</span><span class="sh_symbol">.</span>downLoadQueue<span class="sh_symbol">;</span>
</li>
<li>
<span class="sh_cbracket">}</span>
</li>
<li>
<li>
<span class="sh_keyword">public</span> <span class="sh_keyword">class</span><span class="sh_normal"> </span><span class="sh_classname">public</span> DownLoadServiceBinder <span class="sh_keyword">extends</span> Binder<span class="sh_cbracket">{</span>
</li>
<li>
<span class="sh_keyword">public</span> <span class="sh_usertype">DownloadService</span><span class="sh_normal"> </span><span class="sh_function">getService</span><span class="sh_symbol">()</span><span class="sh_cbracket">{</span>
</li>
<li>
<span class="sh_keyword">return</span> DownloadService<span class="sh_symbol">.</span><span class="sh_keyword">this</span><span class="sh_symbol">;</span>
</li>
<li>
<span class="sh_cbracket">}</span>
</li>
<li>
<span class="sh_cbracket">}</span>
</li></integer>
</li></id></integer>
3. Activity类:
-
public class DownLoadActivity{
-
private Handler handler = new Handler();
-
private DownloadService downLoadService;
-
private ServiceConnection serviceConnection = new ServiceConnection()
-
{
-
- @Override
-
public void onServiceDisconnected(ComponentName name)
-
{
- downLoadService = null;
- Toast.makeText(DownLoadActivity.this, "Service Failed.", Toast.LENGTH_LONG).show();
-
}
-
- @Override
-
public void onServiceConnected(ComponentName name, IBinder service)
-
{
-
- downLoadService = ((DownLoadService.DownLoadServiceBinder) service).getService();
- Toast.makeText(DownLoadActivity.this, "Service Connected.", Toast.LENGTH_LONG).show();
-
}
-
};
-
- @Override
-
public void onCreate(Bundle savedInstanceState){
-
super.onCreate(savedInstanceState);
-
Intent serviceIntent = new Intent(DownLoadActivity.this,DownloadService.class);
-
bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE);
-
startService(serviceIntent);
-
.....
-
}
-
-
private void startDownLoad(){
-
DownLoadQueue queue = new DownLoadQueue();
- queue.id = 1;
- queue.name = "愤怒的小鸟"
-
...
- downLoadService.addDownLoad(queue);
-
....
-
}
-
- @Override
-
public void onDestroy(){
-
super.onDestroy();
-
unbindService(new Intent(DownLoadActivity.this,DownloadService.class));
-
}
4. 在Service中更新Notification时,不能过于频繁,否则会造成卡机。notification使用RemoteView来自定义Notification,加入进度条加入各种说明文字,等等。
以上文字只是简单的提及了一些思路。在项目中已经实现。下次修改完善后贴上来分享。希望能够将该功能做成一个独立的Service供大家在项目中嵌入使用。
分享到:
相关推荐
android实现Service后台下载Notification进度条
NULL 博文链接:https://wosyingjun.iteye.com/blog/2241628
Android notification进度条 demo,欢迎下载!!!!!!!!!!!!!!!!!!!!!!!!!!!!
主要利用了notification service 和receiver 实现了用户通知栏更新,失败了点击重新下载,下载好了点击自动安装,布局很丑,请根据自己项目的实际需求自行修改
android notification Service 文件下载
本文实例讲述了Android实现为Notification加上一个进度条的方法。分享给大家供大家参考,具体如下: package com.notification; import android.app.Activity; import android.app.Notification; import android....
使用android push notification service 实现即时通知
Android 实现自定义通知栏,并不断更新通知栏的进度条,模拟下载效果。 注:只是模拟下载进度,没有下载功能。
android service Notification BroadcastReceiver Intent 安装的服务开机自启动,service定时的打印消息,消息同时显示在通知栏,窗体界面的跳转,自定义控件的开发。系统广播,定时广播,轮询广播等。...
本篇文章主要介绍了Android实现Service下载文件,Notification显示下载进度,具有一定的参考价值,有兴趣的可以了解一下。
用service+notification去做一个支持断点续传的文件下载
Android实现Notification的通知栏常驻.zip
这个例子演示Android 在状态栏添加Notification信息图标及提示,相信大家对这个功能已经不陌生了,手机中安装的APP,一般都会在后台运行,时不时会在手机顶部的状态栏中显示应用的图标,滑出状态栏会看到详细的信息...
Android新手之简单实现Notification 每次点击按钮时发出一个通知。 在通知栏查看通知时,点击通知,可以启动一个自定义的Activity。
android服务自启动Service以及BroadcastReceiver和Notification.zip
NULL 博文链接:https://l540151663.iteye.com/blog/2022729
源码 博文链接:https://cn23snyga.iteye.com/blog/1902071
主要介绍了Android编程使用Service实现Notification定时发送功能,涉及Android服务Service控制通知的发送功能相关操作技巧,需要的朋友可以参考下
带进度条(ProgressBar)的Notification