码迷,mamicode.com
首页 > 移动开发 > 详细

转 android客户端版本检测更新,服务下载,通知栏显示

时间:2015-03-11 22:56:47      阅读:393      评论:0      收藏:0      [点我收藏+]

标签:

 看图, 只要点击取消或是下载完毕 通知才会消失!

  技术分享    技术分享

 代码是大部分是借用别人的,再自己修改,达到自己所需要的效果

xml文件

update.xml

 

[html] view plaincopy
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:background="@drawable/newlogin_bg"  
  6.     android:orientation="vertical" >  
  7.   
  8.   
  9.     <TextView  
  10.         android:layout_width="fill_parent"  
  11.         android:layout_height="wrap_content"  
  12.         android:layout_marginLeft="4dp"  
  13.         android:layout_marginTop="10dp"  
  14.         android:text="正在下载..."  
  15.         android:textColor="#000" />  
  16.   
  17.     <TextView  
  18.         android:id="@+id/currentPos"  
  19.         android:layout_width="fill_parent"  
  20.         android:layout_height="wrap_content"  
  21.         android:layout_marginBottom="6dp"  
  22.         android:layout_marginLeft="4dp"  
  23.         android:layout_marginTop="10dp"  
  24.         android:textColor="#000" />  
  25.   
  26.     <ProgressBar  
  27.         android:id="@+id/progressbar1"  
  28.         style="?android:attr/progressBarStyleHorizontal"  
  29.         android:layout_width="fill_parent"  
  30.         android:layout_height="wrap_content"  
  31.         android:layout_margin="4dp"  
  32.         android:max="100"  
  33.         android:progress="0" />  
  34.   
  35.     <Button  
  36.         android:id="@+id/cancel"  
  37.         android:layout_width="wrap_content"  
  38.         android:layout_height="wrap_content"  
  39.         android:layout_gravity="center_horizontal"  
  40.         android:layout_marginTop="10dp"  
  41.         android:minWidth="200dp"  
  42.         android:text="取消" />  
  43.   
  44. </LinearLayout>  


download_notification_layout.xml

 

 

[html] view plaincopy
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:layout_gravity="center"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <LinearLayout  
  9.         android:layout_centerInParent="true"  
  10.         xmlns:android="http://schemas.android.com/apk/res/android"  
  11.         android:layout_width="match_parent"  
  12.         android:layout_height="wrap_content"  
  13.         android:layout_marginLeft="3dp"  
  14.         android:layout_marginRight="3dp"  
  15.         android:orientation="vertical" >  
  16.   
  17.         <LinearLayout  
  18.             xmlns:android="http://schemas.android.com/apk/res/android"  
  19.             android:layout_width="match_parent"  
  20.             android:layout_height="wrap_content"  
  21.             android:orientation="horizontal" >  
  22.   
  23.             <ImageView  
  24.                 android:id="@+id/image"  
  25.                 android:layout_width="wrap_content"  
  26.                 android:layout_height="wrap_content"  
  27.                 android:background="@drawable/icon" />  
  28.   
  29.             <LinearLayout  
  30.                 xmlns:android="http://schemas.android.com/apk/res/android"  
  31.                 android:layout_width="match_parent"  
  32.                 android:layout_height="wrap_content"  
  33.                 android:layout_marginLeft="3dp"  
  34.                 android:layout_marginRight="3dp"  
  35.                 android:orientation="vertical" >  
  36.   
  37.                 <LinearLayout  
  38.                     xmlns:android="http://schemas.android.com/apk/res/android"  
  39.                     android:layout_width="match_parent"  
  40.                     android:layout_height="wrap_content"  
  41.                     android:layout_marginTop="2dp"  
  42.                     android:orientation="horizontal" >  
  43.   
  44.                     <TextView  
  45.                         android:id="@+id/name"  
  46.                         android:layout_width="wrap_content"  
  47.                         android:layout_height="wrap_content"  
  48.                         android:layout_gravity="center_vertical"  
  49.                         android:text="xxxx.apk"  
  50.                         android:textColor="#000" />  
  51.   
  52.                     <TextView  
  53.                         android:id="@+id/tv_progress"  
  54.                         android:layout_width="wrap_content"  
  55.                         android:layout_height="wrap_content"  
  56.                         android:layout_gravity="center_vertical"  
  57.                         android:gravity="center"  
  58.                         android:minWidth="60dp"  
  59.                         android:textColor="#000" />  
  60.                 </LinearLayout>  
  61.   
  62.                 <ProgressBar  
  63.                     android:id="@+id/progressbar"  
  64.                     style="?android:attr/progressBarStyleHorizontal"  
  65.                     android:layout_width="fill_parent"  
  66.                     android:layout_height="wrap_content"  
  67.                     android:layout_marginRight="4dp"  
  68.                     android:layout_marginTop="3dp"  
  69.                     android:max="100"  
  70.                     android:progress="0"  
  71.                     android:text="xxxx.apk" />  
  72.             </LinearLayout>  
  73.         </LinearLayout>  
  74.   
  75.     </LinearLayout>  
  76.   
  77. </RelativeLayout>  



 

MyApp 

 

[java] view plaincopy
 
  1. package com.zeng.update;  
  2.   
  3. import android.app.Application;  
  4.   
  5. public class MyApp extends Application {  
  6.   
  7.     private boolean isDownload;  
  8.   
  9.     @Override  
  10.     public void onCreate() {  
  11.         // TODO Auto-generated method stub  
  12.         super.onCreate();  
  13.         isDownload = false;  
  14.     }  
  15.   
  16.     public boolean isDownload() {  
  17.         return isDownload;  
  18.     }  
  19.   
  20.     public void setDownload(boolean isDownload) {  
  21.         this.isDownload = isDownload;  
  22.     }  
  23.       
  24.       
  25. }  


Main

 

 

[java] view plaincopy
 
  1. package com.zeng.update;  
  2.   
  3.   
  4.   
  5. import android.app.Activity;  
  6. import android.app.AlertDialog;  
  7. import android.content.DialogInterface;  
  8. import android.content.Intent;  
  9. import android.content.pm.PackageInfo;  
  10. import android.content.pm.PackageManager;  
  11. import android.content.pm.PackageManager.NameNotFoundException;  
  12. import android.os.Bundle;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16.   
  17. public class Main extends Activity {  
  18.     private Button btn_check;  
  19.     private MyApp app;  
  20.     private int currentVersionCode;  
  21.     @Override  
  22.     protected void onCreate(Bundle savedInstanceState) {  
  23.         // TODO Auto-generated method stub  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.main);  
  26.         app = (MyApp) getApplication();  
  27.         btn_check = (Button) findViewById(R.id.check);  
  28.         btn_check.setOnClickListener(new OnClickListener() {  
  29.   
  30.             @Override  
  31.             public void onClick(View v) {  
  32.                 // TODO Auto-generated method stub  
  33.                 PackageManager manager = Main.this.getPackageManager();  
  34.                 try {  
  35.                     PackageInfo info = manager.getPackageInfo(Main.this.getPackageName(), 0);  
  36.                     String appVersion = info.versionName; // 版本名  
  37.                     currentVersionCode = info.versionCode; // 版本号  
  38.                     System.out.println(currentVersionCode + " " + appVersion);  
  39.                 } catch (NameNotFoundException e) {  
  40.                     // TODO Auto-generated catch blockd  
  41.                     e.printStackTrace();  
  42.                 }  
  43.                 //上面是获取manifest中的版本数据,我是使用versionCode  
  44.                 //在从服务器获取到最新版本的versionCode,比较  
  45.                 showUpdateDialog();  
  46.             }  
  47.         });  
  48.     }  
  49.     private void showUpdateDialog() {  
  50.         AlertDialog.Builder builder = new AlertDialog.Builder(this);  
  51.         builder.setTitle("检测到新版本");  
  52.         builder.setMessage("是否下载更新?");  
  53.         builder.setPositiveButton("下载", new DialogInterface.OnClickListener() {  
  54.   
  55.             @Override  
  56.             public void onClick(DialogInterface dialog, int which) {  
  57.                 // TODO Auto-generated method stub  
  58.                 Intent it = new Intent(Main.this, NotificationUpdateActivity.class);  
  59.                 startActivity(it);  
  60. //              MapApp.isDownload = true;  
  61.                 app.setDownload(true);  
  62.             }  
  63.         }).setNegativeButton("取消", new DialogInterface.OnClickListener() {  
  64.   
  65.             @Override  
  66.             public void onClick(DialogInterface dialog, int which) {  
  67.                 // TODO Auto-generated method stub  
  68.   
  69.             }  
  70.         });  
  71.         builder.show();  
  72.     }  
  73. }  


NotificationUpdateActivity    这个我加了一个启动模式 SingleTask

 

 

[java] view plaincopy
 
  1. package com.zeng.update;  
  2.   
  3. import com.zeng.update.DownloadService.DownloadBinder;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.ComponentName;  
  7. import android.content.Context;  
  8. import android.content.Intent;  
  9. import android.content.ServiceConnection;  
  10. import android.content.SharedPreferences;  
  11. import android.os.Bundle;  
  12. import android.os.Handler;  
  13. import android.os.IBinder;  
  14. import android.view.View;  
  15. import android.view.View.OnClickListener;  
  16. import android.widget.Button;  
  17. import android.widget.ProgressBar;  
  18. import android.widget.TextView;  
  19.   
  20. public class NotificationUpdateActivity extends Activity {  
  21.     private Button btn_cancel;// btn_update,  
  22.     private TextView tv_progress;  
  23.     private DownloadBinder binder;  
  24.     private boolean isBinded;  
  25.     private ProgressBar mProgressBar;  
  26.     // 获取到下载url后,直接复制给MapApp,里面的全局变量  
  27.     private String downloadUrl;  
  28.     //  
  29.     private boolean isDestroy = true;  
  30.     private MyApp app;  
  31.   
  32.     /** Called when the activity is first created. */  
  33.     @Override  
  34.     public void onCreate(Bundle savedInstanceState) {  
  35.         super.onCreate(savedInstanceState);  
  36.         setContentView(R.layout.update);  
  37.         app = (MyApp) getApplication();  
  38.         // btn_update = (Button) findViewById(R.id.update);  
  39.         btn_cancel = (Button) findViewById(R.id.cancel);  
  40.         tv_progress = (TextView) findViewById(R.id.currentPos);  
  41.         mProgressBar = (ProgressBar) findViewById(R.id.progressbar1);  
  42.         btn_cancel.setOnClickListener(new OnClickListener() {  
  43.   
  44.             @Override  
  45.             public void onClick(View v) {  
  46.                 // TODO Auto-generated method stub  
  47.                 binder.cancel();  
  48.                 binder.cancelNotification();  
  49.                 finish();  
  50.             }  
  51.         });  
  52.     }  
  53.   
  54.     ServiceConnection conn = new ServiceConnection() {  
  55.   
  56.         @Override  
  57.         public void onServiceDisconnected(ComponentName name) {  
  58.             // TODO Auto-generated method stub  
  59.             isBinded = false;  
  60.         }  
  61.   
  62.         @Override  
  63.         public void onServiceConnected(ComponentName name, IBinder service) {  
  64.             // TODO Auto-generated method stub  
  65.             binder = (DownloadBinder) service;  
  66.             System.out.println("服务启动!!!");  
  67.             // 开始下载  
  68.             isBinded = true;  
  69.             binder.addCallback(callback);  
  70.             binder.start();  
  71.   
  72.         }  
  73.     };  
  74.   
  75.     @Override  
  76.     protected void onResume() {  
  77.         // TODO Auto-generated method stub  
  78.         super.onResume();  
  79.         if (isDestroy && app.isDownload()) {  
  80.             Intent it = new Intent(NotificationUpdateActivity.this, DownloadService.class);  
  81.             startService(it);  
  82.             bindService(it, conn, Context.BIND_AUTO_CREATE);  
  83.         }  
  84.         System.out.println(" notification  onresume");  
  85.     }  
  86.   
  87.     @Override  
  88.     protected void onNewIntent(Intent intent) {  
  89.         // TODO Auto-generated method stub  
  90.         super.onNewIntent(intent);  
  91.         if (isDestroy && app.isDownload()) {  
  92.             Intent it = new Intent(NotificationUpdateActivity.this, DownloadService.class);  
  93.             startService(it);  
  94.             bindService(it, conn, Context.BIND_AUTO_CREATE);  
  95.         }  
  96.         System.out.println(" notification  onNewIntent");  
  97.     }  
  98.   
  99.     @Override  
  100.     protected void onStart() {  
  101.         // TODO Auto-generated method stub  
  102.         super.onStart();  
  103.   
  104.     }  
  105.   
  106.     @Override  
  107.     protected void onPause() {  
  108.         // TODO Auto-generated method stub  
  109.         super.onPause();  
  110.         System.out.println(" notification  onPause");  
  111.     }  
  112.   
  113.     @Override  
  114.     protected void onStop() {  
  115.         // TODO Auto-generated method stub  
  116.         super.onStop();  
  117.         isDestroy = false;  
  118.         System.out.println(" notification  onStop");  
  119.     }  
  120.   
  121.     @Override  
  122.     protected void onDestroy() {  
  123.         super.onDestroy();  
  124.         if (isBinded) {  
  125.             System.out.println(" onDestroy   unbindservice");  
  126.             unbindService(conn);  
  127.         }  
  128.         if (binder != null && binder.isCanceled()) {  
  129.             System.out.println(" onDestroy  stopservice");  
  130.             Intent it = new Intent(this, DownloadService.class);  
  131.             stopService(it);  
  132.         }  
  133.     }  
  134.   
  135.     private ICallbackResult callback = new ICallbackResult() {  
  136.   
  137.         @Override  
  138.         public void OnBackResult(Object result) {  
  139.             // TODO Auto-generated method stub  
  140.             if ("finish".equals(result)) {  
  141.                 finish();  
  142.                 return;  
  143.             }  
  144.             int i = (Integer) result;  
  145.             mProgressBar.setProgress(i);  
  146.             // tv_progress.setText("当前进度 =>  "+i+"%");  
  147.             // tv_progress.postInvalidate();  
  148.             mHandler.sendEmptyMessage(i);  
  149.         }  
  150.   
  151.     };  
  152.   
  153.     private Handler mHandler = new Handler() {  
  154.         public void handleMessage(android.os.Message msg) {  
  155.             tv_progress.setText("当前进度 : " + msg.what + "%");  
  156.   
  157.         };  
  158.     };  
  159.   
  160.     public interface ICallbackResult {  
  161.         public void OnBackResult(Object result);  
  162.     }  
  163. }  


DownloadService

 

 

 

[java] view plaincopy
 
  1. package com.zeng.update;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.net.HttpURLConnection;  
  8. import java.net.MalformedURLException;  
  9. import java.net.URL;  
  10. import java.util.List;  
  11.   
  12. import com.zeng.update.NotificationUpdateActivity.ICallbackResult;  
  13.   
  14. import android.app.Notification;  
  15. import android.app.NotificationManager;  
  16. import android.app.PendingIntent;  
  17. import android.app.Service;  
  18. import android.content.Context;  
  19. import android.content.Intent;  
  20. import android.net.Uri;  
  21. import android.os.Binder;  
  22. import android.os.Handler;  
  23. import android.os.IBinder;  
  24. import android.os.Message;  
  25. import android.widget.RemoteViews;  
  26.   
  27. public class DownloadService extends Service {  
  28.     private static final int NOTIFY_ID = 0;  
  29.     private int progress;  
  30.     private NotificationManager mNotificationManager;  
  31.     private boolean canceled;  
  32.     // 返回的安装包url  
  33.     private String apkUrl = "http://softfile.3g.qq.com:8080/msoft/179/24659/43549/qq_hd_mini_1.4.apk";  
  34.     // private String apkUrl = MyApp.downloadApkUrl;  
  35.     /* 下载包安装路径 */  
  36.     private static final String savePath = "/sdcard/updateApkDemo/";  
  37.   
  38.     private static final String saveFileName = savePath + "3GQQ_AppUpdate.apk";  
  39.     private ICallbackResult callback;  
  40.     private DownloadBinder binder;  
  41.     private MyApp app;  
  42.     private boolean serviceIsDestroy = false;  
  43.   
  44.     private Context mContext = this;  
  45.     private Handler mHandler = new Handler() {  
  46.   
  47.         @Override  
  48.         public void handleMessage(Message msg) {  
  49.             // TODO Auto-generated method stub  
  50.             super.handleMessage(msg);  
  51.             switch (msg.what) {  
  52.             case 0:  
  53.                 app.setDownload(false);  
  54.                 // 下载完毕  
  55.                 // 取消通知  
  56.                 mNotificationManager.cancel(NOTIFY_ID);  
  57.                 installApk();  
  58.                 break;  
  59.             case 2:  
  60.                 app.setDownload(false);  
  61.                 // 这里是用户界面手动取消,所以会经过activity的onDestroy();方法  
  62.                 // 取消通知  
  63.                 mNotificationManager.cancel(NOTIFY_ID);  
  64.                 break;  
  65.             case 1:  
  66.                 int rate = msg.arg1;  
  67.                 app.setDownload(true);  
  68.                 if (rate < 100) {  
  69.                     RemoteViews contentview = mNotification.contentView;  
  70.                     contentview.setTextViewText(R.id.tv_progress, rate + "%");  
  71.                     contentview.setProgressBar(R.id.progressbar, 100, rate, false);  
  72.                 } else {  
  73.                     System.out.println("下载完毕!!!!!!!!!!!");  
  74.                     // 下载完毕后变换通知形式  
  75.                     mNotification.flags = Notification.FLAG_AUTO_CANCEL;  
  76.                     mNotification.contentView = null;  
  77.                     Intent intent = new Intent(mContext, NotificationUpdateActivity.class);  
  78.                     // 告知已完成  
  79.                     intent.putExtra("completed", "yes");  
  80.                     // 更新参数,注意flags要使用FLAG_UPDATE_CURRENT  
  81.                     PendingIntent contentIntent = PendingIntent.getActivity(mContext, 0, intent,  
  82.                             PendingIntent.FLAG_UPDATE_CURRENT);  
  83.                     mNotification.setLatestEventInfo(mContext, "下载完成", "文件已下载完毕", contentIntent);  
  84.                     //  
  85.                     serviceIsDestroy = true;  
  86.                     stopSelf();// 停掉服务自身  
  87.                 }  
  88.                 mNotificationManager.notify(NOTIFY_ID, mNotification);  
  89.                 break;  
  90.             }  
  91.         }  
  92.     };  
  93.   
  94.     //  
  95.     // @Override  
  96.     // public int onStartCommand(Intent intent, int flags, int startId) {  
  97.     // // TODO Auto-generated method stub  
  98.     // return START_STICKY;  
  99.     // }  
  100.   
  101.     @Override  
  102.     public IBinder onBind(Intent intent) {  
  103.         // TODO Auto-generated method stub  
  104.         System.out.println("是否执行了 onBind");  
  105.         return binder;  
  106.     }  
  107.   
  108.     @Override  
  109.     public void onDestroy() {  
  110.         // TODO Auto-generated method stub  
  111.         super.onDestroy();  
  112.         System.out.println("downloadservice ondestroy");  
  113.         // 假如被销毁了,无论如何都默认取消了。  
  114.         app.setDownload(false);  
  115.     }  
  116.   
  117.     @Override  
  118.     public boolean onUnbind(Intent intent) {  
  119.         // TODO Auto-generated method stub  
  120.         System.out.println("downloadservice onUnbind");  
  121.         return super.onUnbind(intent);  
  122.     }  
  123.   
  124.     @Override  
  125.     public void onRebind(Intent intent) {  
  126.         // TODO Auto-generated method stub  
  127.   
  128.         super.onRebind(intent);  
  129.         System.out.println("downloadservice onRebind");  
  130.     }  
  131.   
  132.     @Override  
  133.     public void onCreate() {  
  134.         // TODO Auto-generated method stub  
  135.         super.onCreate();  
  136.         binder = new DownloadBinder();  
  137.         mNotificationManager = (NotificationManager) getSystemService(android.content.Context.NOTIFICATION_SERVICE);  
  138.         setForeground(true);// 这个不确定是否有作用  
  139.         app = (MyApp) getApplication();  
  140.     }  
  141.   
  142.     public class DownloadBinder extends Binder {  
  143.         public void start() {  
  144.             if (downLoadThread == null || !downLoadThread.isAlive()) {  
  145.                   
  146.                 progress = 0;  
  147.                 setUpNotification();  
  148.                 new Thread() {  
  149.                     public void run() {  
  150.                         // 下载  
  151.                         startDownload();  
  152.                     };  
  153.                 }.start();  
  154.             }  
  155.         }  
  156.   
  157.         public void cancel() {  
  158.             canceled = true;  
  159.         }  
  160.   
  161.         public int getProgress() {  
  162.             return progress;  
  163.         }  
  164.   
  165.         public boolean isCanceled() {  
  166.             return canceled;  
  167.         }  
  168.   
  169.         public boolean serviceIsDestroy() {  
  170.             return serviceIsDestroy;  
  171.         }  
  172.   
  173.         public void cancelNotification() {  
  174.             mHandler.sendEmptyMessage(2);  
  175.         }  
  176.   
  177.         public void addCallback(ICallbackResult callback) {  
  178.             DownloadService.this.callback = callback;  
  179.         }  
  180.     }  
  181.   
  182.     private void startDownload() {  
  183.         // TODO Auto-generated method stub  
  184.         canceled = false;  
  185.         downloadApk();  
  186.     }  
  187.   
  188.     //  
  189.     Notification mNotification;  
  190.   
  191.     // 通知栏  
  192.     /** 
  193.      * 创建通知 
  194.      */  
  195.     private void setUpNotification() {  
  196.         int icon = R.drawable.icon;  
  197.         CharSequence tickerText = "开始下载";  
  198.         long when = System.currentTimeMillis();  
  199.         mNotification = new Notification(icon, tickerText, when);  
  200.         ;  
  201.         // 放置在"正在运行"栏目中  
  202.         mNotification.flags = Notification.FLAG_ONGOING_EVENT;  
  203.   
  204.         RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.download_notification_layout);  
  205.         contentView.setTextViewText(R.id.name, "腾讯QQ.apk 正在下载...");  
  206.         // 指定个性化视图  
  207.         mNotification.contentView = contentView;  
  208.   
  209.         Intent intent = new Intent(this, NotificationUpdateActivity.class);  
  210.         // 下面两句是 在按home后,点击通知栏,返回之前activity 状态;  
  211.         // 有下面两句的话,假如service还在后台下载, 在点击程序图片重新进入程序时,直接到下载界面,相当于把程序MAIN 入口改了 - -  
  212.         // 是这么理解么。。。  
  213.         // intent.setAction(Intent.ACTION_MAIN);  
  214.         // intent.addCategory(Intent.CATEGORY_LAUNCHER);  
  215.         PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent,  
  216.                 PendingIntent.FLAG_UPDATE_CURRENT);  
  217.   
  218.         // 指定内容意图  
  219.         mNotification.contentIntent = contentIntent;  
  220.         mNotificationManager.notify(NOTIFY_ID, mNotification);  
  221.     }  
  222.   
  223.     //  
  224.     /** 
  225.      * 下载apk 
  226.      *  
  227.      * @param url 
  228.      */  
  229.     private Thread downLoadThread;  
  230.   
  231.     private void downloadApk() {  
  232.         downLoadThread = new Thread(mdownApkRunnable);  
  233.         downLoadThread.start();  
  234.     }  
  235.   
  236.     /** 
  237.      * 安装apk 
  238.      *  
  239.      * @param url 
  240.      */  
  241.     private void installApk() {  
  242.         File apkfile = new File(saveFileName);  
  243.         if (!apkfile.exists()) {  
  244.             return;  
  245.         }  
  246.         Intent i = new Intent(Intent.ACTION_VIEW);  
  247.         i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  248.         i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");  
  249.         mContext.startActivity(i);  
  250.         callback.OnBackResult("finish");  
  251.   
  252.     }  
  253.   
  254.     private int lastRate = 0;  
  255.     private Runnable mdownApkRunnable = new Runnable() {  
  256.         @Override  
  257.         public void run() {  
  258.             try {  
  259.                 URL url = new URL(apkUrl);  
  260.   
  261.                 HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  262.                 conn.connect();  
  263.                 int length = conn.getContentLength();  
  264.                 InputStream is = conn.getInputStream();  
  265.   
  266.                 File file = new File(savePath);  
  267.                 if (!file.exists()) {  
  268.                     file.mkdirs();  
  269.                 }  
  270.                 String apkFile = saveFileName;  
  271.                 File ApkFile = new File(apkFile);  
  272.                 FileOutputStream fos = new FileOutputStream(ApkFile);  
  273.   
  274.                 int count = 0;  
  275.                 byte buf[] = new byte[1024];  
  276.   
  277.                 do {  
  278.                     int numread = is.read(buf);  
  279.                     count += numread;  
  280.                     progress = (int) (((float) count / length) * 100);  
  281.                     // 更新进度  
  282.                     Message msg = mHandler.obtainMessage();  
  283.                     msg.what = 1;  
  284.                     msg.arg1 = progress;  
  285.                     if (progress >= lastRate + 1) {  
  286.                         mHandler.sendMessage(msg);  
  287.                         lastRate = progress;  
  288.                         if (callback != null)  
  289.                             callback.OnBackResult(progress);  
  290.                     }  
  291.                     if (numread <= 0) {  
  292.                         // 下载完成通知安装  
  293.                         mHandler.sendEmptyMessage(0);  
  294.                         // 下载完了,cancelled也要设置  
  295.                         canceled = true;  
  296.                         break;  
  297.                     }  
  298.                     fos.write(buf, 0, numread);  
  299.                 } while (!canceled);// 点击取消就停止下载.  
  300.   
  301.                 fos.close();  
  302.                 is.close();  
  303.             } catch (MalformedURLException e) {  
  304.                 e.printStackTrace();  
  305.             } catch (IOException e) {  
  306.                 e.printStackTrace();  
  307.             }  
  308.   
  309.         }  
  310.     };  
  311.   
  312. }  



 

   参照博客

 http://blog.csdn.net/liuhe688/article/details/6623924

还有些代码是另一个下载的demo的 不过忘了哪下的~

 

 源码下载

http://download.csdn.net/detail/zgf1991/5725471

转 android客户端版本检测更新,服务下载,通知栏显示

标签:

原文地址:http://www.cnblogs.com/wikiki/p/4331013.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!