Android文件下載及自定義通知顯示下載進度
主要實現了一下幾個類:
(1)文件下載:設計自定義類,只需傳入一個Handler、下載地址URLStr及保存路徑及可實現下載的功能。handler主要用于線程間通信,跟新通知中的進度條。
對于handler發送消息更新UI線程實現進度展示的時候一定注意不要太過頻繁,過設置計數器隔一定時間才發送消息,不然容易引起系統奔潰
(2) 通知(Notification):提供系統默認自帶形式以及自定義通知欄布局兩種形式。
(3) 服務:后臺服務,startService啟動模式
package com.example.test;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.widget.RemoteViews;
/**
* Notification類,既可用系統默認的通知布局,也可以用自定義的布局
*
* @author lz
*
*/
public class MyNotification {
public final static int DOWNLOAD_COMPLETE = -2;
public final static int DOWNLOAD_FAIL = -1;
Context mContext; //Activity或Service上下文
Notification notification; //notification
NotificationManager nm;
String titleStr; //通知標題
String contentStr; //通知內容
PendingIntent contentIntent; //點擊通知后的動作
int notificationID; //通知的唯一標示ID
int iconID; //通知欄圖標
long when = System.currentTimeMillis();
RemoteViews remoteView=null; //自定義的通知欄視圖
/**
*
* @param context Activity或Service上下文
* @param contentIntent 點擊通知后的動作
* @param id 通知的唯一標示ID
*/
public MyNotification(Context context,PendingIntent contentIntent,int id) {
// TODO Auto-generated constructor stub
mContext=context;
notificationID=id;
this.contentIntent=contentIntent;
this.nm=(NotificationManager)mContext.getSystemService(Context.NOTIFICATION_SERVICE);
}
/**
* 顯示自定義通知
* @param icoId 自定義視圖中的圖片ID
* @param titleStr 通知欄標題
* @param layoutId 自定義布局文件ID
*/
public void showCustomizeNotification(int icoId,String titleStr,int layoutId) {
this.titleStr=titleStr;
notification=new Notification(R.drawable.ic_launcher, titleStr, when);
notification.flags = Notification.FLAG_ONLY_ALERT_ONCE;
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.contentIntent=this.contentIntent;
// 1、創建一個自定義的消息布局 view.xml
// 2、在程序代碼中使用RemoteViews的方法來定義image和text。然后把RemoteViews對象傳到contentView字段
if(remoteView==null)
{
remoteView = new RemoteViews(mContext.getPackageName(),layoutId);
remoteView.setImageViewResource(R.id.ivNotification,icoId);
remoteView.setTextViewText(R.id.tvTitle, titleStr);
remoteView.setTextViewText(R.id.tvTip, "開始下載");
remoteView.setProgressBar(R.id.pbNotification, 100, 0, false);
notification.contentView = remoteView;
}
nm.notify(notificationID, notification);
}
/**
* 更改自定義布局文件中的進度條的值
* @param p 進度值(0~100)
*/
public void changeProgressStatus(int p)
{
if(notification.contentView!=null)
{
if(p==DOWNLOAD_FAIL)
notification.contentView.setTextViewText(R.id.tvTip , "下載失敗! ");
else if(p==100)
notification.contentView.setTextViewText(R.id.tvTip , "下載完成,請點擊安裝");
else
notification.contentView.setTextViewText(R.id.tvTip , "進度("+p+"%) : ");
notification.contentView.setProgressBar(R.id.pbNotification, 100, p, false);
}
nm.notify(notificationID, notification);
}
public void changeContentIntent(PendingIntent intent)
{
this.contentIntent=intent;
notification.contentIntent=intent;
}
/**
* 顯示系統默認格式通知
* @param iconId 通知欄圖標ID
* @param titleText 通知欄標題
* @param contentStr 通知欄內容
*/
public void showDefaultNotification(int iconId,String titleText,String contentStr) {
this.titleStr=titleText;
this.contentStr=contentStr;
this.iconID=iconId;
notification=new Notification();
notification.tickerText=titleStr;
notification.icon=iconID;
notification.flags = Notification.FLAG_INSISTENT;
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.contentIntent=this.contentIntent;
// 添加聲音效果
// notification.defaults |= Notification.DEFAULT_SOUND;
// 添加震動,后來得知需要添加震動權限 : Virbate Permission
// mNotification.defaults |= Notification.DEFAULT_VIBRATE ;
//添加狀態標志
//FLAG_AUTO_CANCEL 該通知能被狀態欄的清除按鈕給清除掉
//FLAG_NO_CLEAR 該通知能被狀態欄的清除按鈕給清除掉
//FLAG_ONGOING_EVENT 通知放置在正在運行
//FLAG_INSISTENT 通知的音樂效果一直播放
notification.flags = Notification.FLAG_ONLY_ALERT_ONCE;
changeNotificationText(contentStr);
}
/**
* 改變默認通知欄的通知內容
* @param content
*/
public void changeNotificationText(String content)
{
notification.setLatestEventInfo(mContext, titleStr, content,contentIntent);
// 設置setLatestEventInfo方法,如果不設置會App報錯異常
// NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//注冊此通知
// 如果該NOTIFICATION_ID的通知已存在,會顯示最新通知的相關信息 ,比如tickerText 等
nm.notify(notificationID, notification);
}
/**
* 移除通知
*/
public void removeNotification()
{
// 取消的只是當前Context的Notification
nm.cancel(notificationID);
}
} 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!