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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!