代码:
public class MainActivity extends Activity { private DownloadManager downloadManager; public static final String DOWNLOAD_FOLDER_NAME = "Trinea"; public static final String DOWNLOAD_FILE_NAME = "MeiLiShuo.apk"; public static final String APK_URL = "http://img.meilishuo.net/css/images/AndroidShare/Meilishuo_3.6.1_10006.apk"; public static final String KEY_NAME_DOWNLOAD_ID = "downloadId"; private long downloadId = 0; private CompleteReceiver completeReceiver; @TargetApi(Build.VERSION_CODES.HONEYCOMB) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); findViewById(R.id.button1).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub File folder = Environment .getExternalStoragePublicDirectory(DOWNLOAD_FOLDER_NAME); if (!folder.exists() || !folder.isDirectory()) { folder.mkdirs(); } DownloadManager.Request request = new DownloadManager.Request( Uri.parse(APK_URL)); request.setDestinationInExternalPublicDir(DOWNLOAD_FOLDER_NAME, DOWNLOAD_FILE_NAME); request.setTitle("美丽传说"); request.setDescription("meilishuo desc"); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); request.setVisibleInDownloadsUi(false); // request.allowScanningByMediaScanner(); // request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI); // request.setShowRunningNotification(false); // request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN); //application/cn.trinea.download.file request.setMimeType("application/vnd.android.package-archive"); downloadId = downloadManager.enqueue(request); /** save download id to preferences **/ } }); } private void init() { // TODO Auto-generated method stub completeReceiver = new CompleteReceiver(); /** register download success broadcast **/ registerReceiver(completeReceiver, new IntentFilter( DownloadManager.ACTION_DOWNLOAD_COMPLETE)); downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); } private int getInt(long downloadId, String columnName) { DownloadManager.Query query = new DownloadManager.Query() .setFilterById(downloadId); int result = -1; Cursor c = null; try { c = downloadManager.query(query); if (c != null && c.moveToFirst()) { result = c.getInt(c.getColumnIndex(columnName)); } } finally { if (c != null) { c.close(); } } return result; } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(completeReceiver); } class CompleteReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { /** * get the id of download which have download success, if the id is * my id and it's status is successful, then install it **/ long completeDownloadId = intent.getLongExtra( DownloadManager.EXTRA_DOWNLOAD_ID, -1); if (completeDownloadId == downloadId) { // if download successful, install apk // if (downloadManagerPro.getStatusById(downloadId) == // DownloadManager.STATUS_SUCCESSFUL) { if (getInt(downloadId, DownloadManager.COLUMN_STATUS) == DownloadManager.STATUS_SUCCESSFUL) { String apkFilePath = new StringBuilder(Environment .getExternalStorageDirectory().getAbsolutePath()) .append(File.separator) .append(DOWNLOAD_FOLDER_NAME) .append(File.separator).append(DOWNLOAD_FILE_NAME) .toString(); install(context, apkFilePath); } } } }; /** * install app * * @param context * @param filePath * @return whether apk exist */ public static boolean install(Context context, String filePath) { Intent i = new Intent(Intent.ACTION_VIEW); File file = new File(filePath); if (file != null && file.length() > 0 && file.exists() && file.isFile()) { i.setDataAndType(Uri.parse("file://" + filePath), "application/vnd.android.package-archive"); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); return true; } return false; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
清单文件里的权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
但是在做系统适配的时会出问题,上面的这种不支持低版本的,所以自己写service来后台更新
/** * 更新apk * * @author jian.zhou test */ @SuppressLint("HandlerLeak") public class UpdateService extends Service { private static final int DOWN_OK = 1; private static final int DOWN_ERROR = 0; private String app_name; private NotificationManager notificationManager; private PendingIntent pendingIntent; private int notification_id = 0; protected FinalHttp finalHttp; @Override public IBinder onBind(Intent arg0) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { finalHttp = new FinalHttp(); app_name=intent.getStringExtra("app_name"); createNotification(); createThread(); return super.onStartCommand(intent, flags, startId); } Handler handler = new Handler() { @SuppressWarnings("deprecation") @Override public void handleMessage(Message msg) { switch (msg.what) { case DOWN_OK: Uri uri = Uri.fromFile(new File(FileUtlis.getSDKPath() + app_name)); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, "application/vnd.android.package-archive"); pendingIntent = PendingIntent.getActivity(UpdateService.this, 0, intent, 0); contentViews.setTextViewText(R.id.notificationTitle, "下载完成!点击安装"); mBuilder.setContentIntent(pendingIntent); notificationManager.notify(notification_id, mBuilder.build()); stopService(new Intent("mmdops.services.UpdateService")); break; case DOWN_ERROR: contentViews.setTextViewText(R.id.notificationTitle, "下载失败!"); notificationManager.notify(notification_id, mBuilder.build()); break; default: stopService(new Intent("mmdops.services.UpdateService")); break; } } }; /*** * 开线程下载 */ public void createThread() { String path = FileUtlis.createFile(app_name); Logger.e("PATH---->"+path); finalHttp.download(Cants.HTTP_DOWN_APK, path, new AjaxCallBack<File>() { @Override public void onStart() { // TODO Auto-generated method stub super.onStart(); Logger.e("----------->下载开始!"); } @Override public void onLoading(long count, long current) { // TODO Auto-generated method stub super.onLoading(count, current); Logger.e("----------->下载..."); contentViews.setProgressBar(R.id.notificationProgress, (int) count, (int) current, false); // show_view notificationManager.notify(notification_id, mBuilder.build()); } @Override public void onSuccess(File t) { // TODO Auto-generated method stub super.onSuccess(t); Logger.e("----------->下载onSuccess!"); handler.obtainMessage(DOWN_OK).sendToTarget(); } @Override public void onFailure(Throwable t, int errorNo, String strMsg) { // TODO Auto-generated method stub super.onFailure(t, errorNo, strMsg); handler.obtainMessage(DOWN_ERROR).sendToTarget(); } }); } /*** * 创建通知栏 */ private RemoteViews contentViews; private NotificationCompat.Builder mBuilder; public void createNotification() { contentViews = new RemoteViews(getPackageName(), R.layout.notification_item); contentViews.setTextViewText(R.id.notificationTitle, "正在下载"); contentViews.setProgressBar(R.id.notificationProgress, 100, 0, false); Intent intent = new Intent(this, LoginActivity.class); pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); mBuilder = new NotificationCompat.Builder(this).setSmallIcon( R.drawable.logo_jm).setTicker("后台更新中"); mBuilder.setAutoCancel(true); mBuilder.setContentIntent(pendingIntent); mBuilder.setContent(contentViews); mBuilder.setAutoCancel(true); notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(notification_id, mBuilder.build()); } }