使用Notification更新多任务下载进度。大牛请绕路!!!

在网上真心没找到实现这样的代码,工作需要,只能苦X 自己实现了。

转载请注明:http://cn23snyga.iteye.com/blog/1902071

如图:


启动页面NotificationActivity06:(从这文件名,就可以看出我苦X 了多少个版本)

package com.example.notification06;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.view.View;import com.example.services.DownloadServices;public class NotificationActivity06 extends Activity{private Context mContext = NotificationActivity06.this;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void downloadNP(View view){startDownloadService(0, "http://61.50.254.57:8088/nature-person/mobilenature/download/NaturalSaler_common.apk");}public void downloadYUN(View view){startDownloadService(1, "http://mix.911860.com/resources/apkupdate/7/common/mix-common.apk");}public void downloadTNews(View view){startDownloadService(2, "http://mix.911860.com/resources/mix/custom-apks/01-TencentNews/TencentNews.apk");}public void startDownloadService(int notifyId, String url){Intent i = new Intent(mContext, DownloadServices.class);i.putExtra("url", url);i.putExtra("notifyId", notifyId);mContext.startService(i);}}

其中的下载链接,换成自己需要的就好了。

下载服务DownloadServices:

package com.example.services;import java.io.File;import java.util.HashMap;import java.util.Map;import java.util.Timer;import java.util.TimerTask;import android.app.Notification;import android.app.NotificationManager;import android.app.Service;import android.content.Context;import android.content.Intent;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.widget.Toast;import com.example.bean.DownloadTask;import com.example.bean.NotificationBean;import com.example.notification06.R;import com.example.utils.DownloadUtil;import com.example.utils.DownloadUtil.IOnDownloadListener;public class DownloadServices extends Service{private Context mContext = DownloadServices.this;/** 正在下载 */private final int DOWN_LOADING = 0;/** 下载完成 */private final int DOWN_COMPLETE = 1;/** 下载失败 */private final int DOWN_ERR = 2;/** Timer 执行时间间隔 */private final int TIMER_PERIOD = 1500;protected Timer mTimer;protected NotificationManager mNotificationManager;/** 下载任务管理 */protected Map<String, DownloadTask> map_downloadtask;@Overridepublic IBinder onBind(Intent intent){return null;}@Overridepublic void onDestroy(){super.onDestroy();}@Overridepublic void onCreate(){// TODO Auto-generated method stubsuper.onCreate();mTimer = new Timer();mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);map_downloadtask = new HashMap<String, DownloadTask>();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId){String mUrl = intent.getExtras().getString("url");int mNotifyId = intent.getExtras().getInt("notifyId");Notification mNotification = new NotificationBean(this, R.drawable.ic_launcher, "开始下载", System.currentTimeMillis());System.out.println("NotifyId = " + mNotifyId);if(map_downloadtask.containsKey(mUrl)){Toast.makeText(mContext, "已存在此下载任务", Toast.LENGTH_SHORT).show();}else{DownloadTask mDownloadTask = new DownloadTask();mDownloadTask.setUrl(mUrl);mDownloadTask.setNotifyID(mNotifyId);mDownloadTask.setNotification(mNotification);map_downloadtask.put(mUrl, mDownloadTask);Runnable mRunnable = new MyRunnable(mDownloadTask);new Thread(mRunnable).start();}return super.onStartCommand(intent, flags, startId);}class MyRunnable implements Runnable{private DownloadUtil mDownUtil = new DownloadUtil();private DownloadTask mDownTask;private Handler mHandler;private TimerTask mTimerTask;public MyRunnable(DownloadTask downTask)        {        super();        this.mDownTask = downTask;        this.mHandler = new MyHandler(mDownUtil);        this.mTimerTask = new MyTimerTask(mDownUtil, mHandler, mDownTask);        }@Overridepublic void run(){mTimer.schedule(mTimerTask, 0, TIMER_PERIOD);mDownUtil.downloadFile(mDownTask.getUrl());}}class MyTimerTask extends TimerTask{private Handler mHandler;private DownloadUtil mDownUtil;private DownloadTask mDownTask;private IOnDownloadListener mListener;public MyTimerTask(DownloadUtil downUtil, Handler handler, DownloadTask downTask)        {        super();        this.mHandler = handler;        this.mDownUtil = downUtil;        this.mDownTask = downTask;        this.mListener = new IOnDownloadListener(){@Overridepublic void updateNotification(int progress, int totalSize, File downFile){// TODO Auto-generated method stubint rate = 0;// 计算百分比if (totalSize > 0){rate = progress * 100 / totalSize;mHandler.obtainMessage(DOWN_LOADING, rate, mDownTask.getNotifyID(), mDownTask.getNotification()).sendToTarget();}else if (totalSize == 0){mHandler.obtainMessage(DOWN_LOADING, 0, mDownTask.getNotifyID(), mDownTask.getNotification()).sendToTarget();}else {cancel();mHandler.obtainMessage(DOWN_ERR, mDownTask).sendToTarget();}// 是否下载结束if (totalSize > 0 && null != downFile && totalSize == (int) downFile.length()){cancel();mHandler.obtainMessage(DOWN_COMPLETE, downFile).sendToTarget();map_downloadtask.remove(mDownTask.getUrl());// 移除已完成任务System.out.println("DOWN_COMPLETE ==> totalSize ==> " + totalSize);}}};        }@Overridepublic void run(){mDownUtil.setOnDownloadListener(mListener);}}class MyHandler extends Handler{private DownloadUtil mDownUtil;public MyHandler(DownloadUtil downUtil)        {        super();        this.mDownUtil = downUtil;        }@Overridepublic void handleMessage(Message msg){switch (msg.what){case DOWN_LOADING:((Notification)msg.obj).contentView.setProgressBar(R.id.pb, 100, msg.arg1, false);((Notification)msg.obj).contentView.setTextViewText(R.id.tv, "下载" + msg.arg1 + "%");mNotificationManager.notify(msg.arg2, ((Notification)msg.obj));System.out.println("DOWN_LOADING --> mNotifyId --> " + msg.arg2 + " --> " + msg.arg1 + "%");break;case DOWN_COMPLETE://mNotificationManager.cancel(mNotifyId);removeMessages(DOWN_LOADING);Toast.makeText(mContext, "下载完成", Toast.LENGTH_SHORT).show();mDownUtil.installApk(mContext, (File)msg.obj);System.out.println("======================DOWN_COMPLETE================================");stopService();break;case DOWN_ERR:removeMessages(DOWN_LOADING);map_downloadtask.remove(((DownloadTask)msg.obj).getUrl());Toast.makeText(mContext, "下载失败", Toast.LENGTH_SHORT).show();stopService();break;default:break;}}/** * 如果无下载任务,关闭服务 */private void stopService(){if(map_downloadtask.isEmpty()){stopSelf(-1);}}}}

封装Notification:

package com.example.bean;import android.app.Notification;import android.app.PendingIntent;import android.content.Context;import android.content.Intent;import android.widget.RemoteViews;import com.example.notification06.NotificationActivity06;import com.example.notification06.R;public class NotificationBean extends Notification{private Context mContext;public NotificationBean(Context context, int icon, CharSequence tickerText, long when){super(icon, tickerText, when);this.mContext = context;this.flags = Notification.FLAG_AUTO_CANCEL; // |= //this.flags = Notification.FLAG_ONGOING_EVENT;RemoteViews mRemoteView = new RemoteViews(mContext.getPackageName(), R.layout.remote_view);this.contentView = mRemoteView;Intent intent = new Intent(mContext, NotificationActivity06.class); // 点击安装APK 未实现intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);PendingIntent pIntent = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);this.contentIntent = pIntent;}}

封装下载任务DownloadTask:

package com.example.bean;import android.app.Notification;public class DownloadTask{private String url;private int notifyID;private Notification notification;public DownloadTask(){// TODO Auto-generated constructor stub}public Notification getNotification()    {    return notification;    }public void setNotification(Notification notification)    {    this.notification = notification;    }public int getNotifyID()    {    return notifyID;    }public void setNotifyID(int notifyID)    {    this.notifyID = notifyID;    }public String getUrl()    {    return url;    }public void setUrl(String url)    {    this.url = url;    }}

完毕。

更多相关文章

  1. 网络数据请求实践一:android-async-http实现下载和上传
  2. Android源码50例汇总,欢迎各位下载 【转载自51CTO】
  3. GoogleApi与Android(安卓)SDK区别
  4. Android(安卓)xUtils3的使用及下载地址
  5. android 的NDK在Windwos环境搭建(一)
  6. Xamarin.Forms教程Android(安卓)SDK工具下载安装
  7. Android(安卓)PackageManagerService(二)下载安装详解
  8. Android学习系列(19)--App离线下载
  9. Android(安卓)音视频深入 十四 FFmpeg与OpenSL ES 播放mp3音乐,能

随机推荐

  1. android Camera模块分析
  2. Android实现对imageview的拖动以及缩放
  3. android 常用代码
  4. Android(安卓)创建与解析XML(五)—— Dom4j
  5. android handle ui 更新
  6. Android(安卓)View.startAnimation()动画
  7. android设置图片变化的四种效果代码
  8. To make the android emulator (AVD) wor
  9. Android(安卓)创建与解析XML(五)—— Dom4j
  10. android -- 小功能 Android为多媒体文件