有时候会有些业务需要后台运行并以通知的形式,比如升级,监控什么的。
这里说下我的业务,通过提示用户升级,然后点击升级开启一个service服务在
后台进行下载并以通知的形式提供用户查看,下载完成点击通知进入安装。
1.开启服务
Intent intent = new Intent();
intent.setClass(mContext, UpgradeService.class);
startService(intent);
2.建立一个服务servive类
在onStart方法中建立notification,做写准备工作.
@Override
public void onStart(Intent intent, int startId) {
String sdPath = FileHelper.getSDCardPath();
if (sdPath != null) {
updateFile = new File(sdPath + Global.downloadDir + "petfone.apk");
// 初始化通知管理器
this.updateNotificationMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
this.updateNotification = new Notification();
updateNotification.icon=R.drawable.ic_launcher;
updateIntent = new Intent(this, UpdateAppDemoActivity.class);
updatePendingIntent = PendingIntent.getActivity(this, 0,updateIntent, 0);
//通知自定义视图
updateNotification.contentView = new RemoteViews(getPackageName(),com.hua.test.R.layout.mynotification_progressbar);
updateNotification.contentView.setProgressBar(com.hua.test.R.id.pb_notifi, 100, 0, false);
updateNotification.contentIntent = updatePendingIntent;//这个pengdingIntent很重要,必须要设置
// 发出通知
//updateNotificationMgr.notify(notificationId, updateNotification);
// 开启线程进行下载
new Thread(new updateThread()).start();
}
super.onStart(intent, startId);
}
3.开启一个线程来下载防止主线程堵塞。这里在servce写了一个内部类实现了Runnable
class updateThread implements Runnable {
Message msg = handler.obtainMessage();
@Override
public void run() {
try {
if (!updateFile.exists()) {
updateFile.createNewFile();
}
long downSize = downloadFile(Global.NET_ADDRESS+"PetFone_G_Google.apk",updateFile);
if(downSize>0){
//下载成功!
msg.what=DOWNLOAD_SUCCESS;
handler.sendMessage(msg);
}
} catch (Exception ex) {
ex.printStackTrace();//下载失败
msg.what=DOWNLOAD_FALL;
handler.sendMessage(msg);
}
}
}
/**
* 下载文件
* @param downloadUrl 下载路径
* @param saveFile 保存文件名
*/
public long downloadFile(String downloadUrl, File saveFile) throws Exception {
int downloadCount = 0;
int currentSize = 0;
long totalSize = 0;
int updateTotalSize = 0;
HttpURLConnection httpConnection = null;
InputStream is = null;
FileOutputStream fos = null;
try{
URL url = new URL(downloadUrl);
httpConnection = (HttpURLConnection)url.openConnection();
httpConnection.setRequestProperty("User-Agent", "PacificHttpClient");
if(currentSize > 0) {
httpConnection.setRequestProperty("RANGE", "bytes=" + currentSize + "-");
}
httpConnection.setConnectTimeout(10000);
httpConnection.setReadTimeout(20000);
updateTotalSize = httpConnection.getContentLength();//总大小
if(httpConnection.getResponseCode()==404){
throw new Exception("conection net 404!");
}
is = httpConnection.getInputStream();
fos = new FileOutputStream(saveFile);
byte[] buf = new byte[1024];
int readSize = -1;
while((readSize = is.read(buf)) != -1){
fos.write(buf, 0, readSize);
//通知更新进度
totalSize += readSize;
int tmp = (int) (totalSize * 100 / updateTotalSize);
//为了防止频繁的通知导致应用吃紧,百分比增加10才通知一次
if(downloadCount == 0 || tmp-10>downloadCount){
downloadCount+=10;
Message msg = handler.obtainMessage();
msg.what=DOWNLOAD_COMPLETE;
msg.arg1=downloadCount;
handler.sendMessage(msg);
}
}
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(httpConnection != null) {
httpConnection.disconnect();
}
if(is != null) {
is.close();
}
if(fos != null) {
fos.close();
}
}
return totalSize;
}
4.需要不段的给progressBar 提供值,所以要使用handler,下载文件一定也就有3种状态,
1).下载中,2).下载失败,3).下载成功。
在servive中定义好handler并定义这个3个状态码。
private final int DOWNLOAD_COMPLETE = 1, DOWNLOAD_FALL=2,DOWNLOAD_SUCCESS=3;
然后在处理这个message
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch(msg.what){
case DOWNLOAD_SUCCESS:
//下载完成点击通知进入安装
Uri uri = Uri.fromFile(updateFile);
Intent installIntent = new Intent(Intent.ACTION_VIEW);
installIntent.setDataAndType(uri, "application/vnd.android.package-archive");
updatePendingIntent = PendingIntent.getActivity(UpgradeService.this, 0, installIntent, 0);
updateNotification.defaults = Notification.DEFAULT_SOUND;//设置铃声
updateNotification.contentIntent = updatePendingIntent;
//更新通知视图值
updateNotification.contentView.setTextViewText(com.hua.test.R.id.tv_downInfo, "下载成功,点击安装。");
updateNotification.contentView.setProgressBar(com.hua.test.R.id.pb_notifi, 100, 100, false);
updateNotificationMgr.notify(notificationId, updateNotification);
stopService(updateIntent);//停止service
break;
case DOWNLOAD_COMPLETE://下载中状态
System.out.println(msg.arg1);
updateNotification.contentView.setProgressBar(com.hua.test.R.id.pb_notifi, 100, msg.arg1, false);
updateNotification.contentView.setTextViewText(R.id.tv_downInfo, "下载中"+msg.arg1+"%");
updateNotificationMgr.notify(notificationId, updateNotification);
break;
case DOWNLOAD_FALL://失败状态
//updateNotification.setLatestEventInfo(UpgradeService.this, "下载失败", "", updatePendingIntent);]
updateNotification.contentView.setTextViewText(com.hua.test.R.id.tv_downInfo, "下载失败");
updateNotificationMgr.notify(notificationId, updateNotification);
stopService(updateIntent);//停止service
break;
default:
stopService(updateIntent);
}
}
};
- 大小: 17.2 KB
分享到:
相关推荐
Android一个带有进度条的通知栏的DEMO,对初学Android的初学者是一个不错的参考例子,代码实现了点击显示按钮就会在通知栏上出现一个有图片和进度条的提示,点击取消按钮就会取消通知栏的提示通知。
在Android开发中,提供带有进度条的通知栏是提升用户体验的重要方式之一。这使得用户在后台进行数据同步、文件下载等耗时操作时,能够清晰地了解任务的进度,增加了交互性和透明度。以下是对"Android更新带进度条的...
本文将深入探讨如何实现一个自定义的通知栏,以动态更新进度条来模拟下载过程。虽然这里并不涉及实际的下载逻辑,但我们会讨论如何创建一个能够展示进度的自定义通知。 首先,我们需要理解Android的通知系统。在...
在Android开发中,通知栏(Notification)是一种向用户传达应用状态和信息的重要方式,而进度条(Progress Bar)则是展示任务执行进度的关键组件。本文将深入探讨如何在Android通知栏中使用常见方法以及如何显示...
标题“带进度条的状态栏的资源”暗示了这是一个包含用于创建或修改带有进度条的状态栏的资源集合。这些资源可能包括但不限于代码示例、设计图稿、库文件或者教程文档,旨在帮助开发者或设计师实现这种功能。 在开发...
接下来,我们讨论带进度的通知栏。在某些场景下,如文件下载或上传,用户可能希望在通知栏中查看任务的进度。在Android中,可以使用`setProgress()`方法设置进度条,传递最大值、当前值和是否显示 indeterminate(不...
9. **用户通知**:当更新完成或失败时,应用应通过通知栏提醒用户。这可以是成功下载后的安装提示,也可以是下载失败的错误信息。 10. **测试与优化**:为了让这个功能稳定可靠,开发者需要进行多设备、多网络环境...
在这种情况下,使用带有进度条的系统通知栏消息是一种很好的解决方案。本文将详细介绍如何在Android项目中实现这样一个功能。 首先,我们需要创建一个通知栏消息的布局文件,例如`content_view.xml`。这个布局文件...
9. **通知栏通知**: 由于Service在后台运行,为了提供用户体验,通常会在通知栏显示音乐播放的控制,让用户即使在后台也能控制音乐。 10. **线程管理**: 音频操作通常应在独立的线程中进行,避免阻塞主线程。可以...
Android 编程实现通知栏进度条效果的方法示例主要介绍了 Android 编程实现通知栏进度条效果的方法,结合实例形式较为详细的分析了 Android 通知栏进度条效果的功能、布局相关实现方法与操作注意事项。下面是对 ...
在进度条完成时,可以更改该面板的文本,通知用户任务已完成: ```csharp panel.Text = "任务已完成!"; ``` 这就是如何在.NET 2005的C#环境中,在状态栏中使用进度条的基本步骤。通过这样的实现,你可以为用户...
本资源"安卓进度条loadingprogress相关-APK下载跟新安装带通知栏跟新下载进度.rar"可能包含实现这一功能的相关代码和资源文件,帮助开发者了解如何在Android应用中创建一个实时更新的通知栏进度条,并且在后台执行...
通常,我们会创建一个下载线程,该线程不断从服务器获取数据并写入本地文件,同时将下载进度通过Handler或BroadcastReceiver传递到主线程,更新通知栏的进度条。 关于“后台下载”,在Android系统中,服务(Service...
- **示例代码**:展示如何创建和管理各种类型的通知,包括基本通知、带进度条的通知、大图通知等。 - **文档教程**:详细解释了Android通知的相关API和最佳实践。 - **apk下载**:可能是一个示例应用,用于演示不同...
总的来说,"android 文件上传含进度条"这个话题涵盖的知识点包括Android文件操作、网络编程、异步任务处理、UI更新机制以及可能的通知栏管理。理解并掌握这些,对于Android开发者来说至关重要,尤其是在优化用户体验...
在Android系统中,"Service通知栏提醒"是一个常见的功能,它允许应用在状态栏显示提醒,用户可以方便地点击进入相关界面。这个功能通常用于实时更新的应用,如聊天软件(如QQ、微信)或文件下载工具,它们需要在后台...
本主题聚焦于"自定义进度条"和"通知栏"的定制,这在移动应用开发,尤其是Android平台上的应用设计中非常重要。自定义组件可以让开发者根据品牌形象或者用户需求来提供更加个性化的交互体验。 首先,我们要理解...
在Android应用开发中,"android带通知栏的版本更新"是一个重要的功能,它允许应用程序在后台静默下载新版本,并通过通知栏提醒用户更新。这个功能对于保持应用的最新状态和提升用户体验至关重要。下面我们将详细探讨...