下载android应用有两种表现形式:一种是交给Android系统的下载管理器;另一种是自己去监控下载。
1.使用Android下载管理器下载应用并安装
public class UpdateService extends Service {
// 安卓系统下载管理类
DownloadManager manager;
// 接收下载完的广播
DownloadCompleteReceiver receiver;
// 初始化下载器
private void initDownManager(String url) {
manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
receiver = new DownloadCompleteReceiver();
//设置下载地址
DownloadManager.Request down = new DownloadManager.Request(
Uri.parse(url));
// 设置允许使用的网络类型,这里是移动网络和wifi都可以
down.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE
| DownloadManager.Request.NETWORK_WIFI);
// 下载时,通知栏显示途中
down.setNotificationVisibility(Request.VISIBILITY_VISIBLE);
// 显示下载界面
down.setVisibleInDownloadsUi(true);
// 设置下载后文件存放的位置
down.setDestinationInExternalFilesDir(this,
Environment.DIRECTORY_DOWNLOADS, "update.apk");
// 将下载请求放入队列
manager.enqueue(down);
//注册下载广播
registerReceiver(receiver, new IntentFilter(
DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String url= intent.getStringExtra("url");
// 调用下载
initDownManager(url);
return 0;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
// 注销下载广播
if (receiver != null)
unregisterReceiver(receiver);
super.onDestroy();
}
// 接受下载完成后的intent
class DownloadCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//判断是否下载完成的广播
if (intent.getAction().equals(
DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
System.out.println("download complete!");
//获取下载的文件id
long downId = intent.getLongExtra(
DownloadManager.EXTRA_DOWNLOAD_ID, -1);
//自动安装apk
installAPK(manager.getUriForDownloadedFile(downId));
//停止服务并关闭广播
UpdateService.this.stopSelf();
}
}
/**
* 安装apk文件
*/
private void installAPK(Uri apk) {
// 通过Intent安装APK文件
Intent intents = new Intent();
System.out.println("auto install");
intents.setAction("android.intent.action.VIEW");
intents.addCategory("android.intent.category.DEFAULT");
intents.setType("application/vnd.android.package-archive");
intents.setData(apk);
intents.setDataAndType(apk,"application/vnd.android.package-archive");
intents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//android.os.Process.killProcess(android.os.Process.myPid());
// 有的设备不加上这句的话在apk安装完成之后点击单开始可能会崩溃
startActivity(intents);
}
}
}
2.
自己监控下载。
public class UpdateDialog extends Dialog implements OnClickListener{
Button download,cancel;
String apkurl="http://....../";
String savePath="/**/**/update/";
String saveFileName=savePath+"/adf.apk";
<pre name="code" class="java"> ProgressBar mProgress;//进度条
Context mContext;
<span style="font-size:24px;"></span><pre name="code" class="java"> private static final int DOWN_UPDATE = 1;//下载更新
private static final int DOWN_OVER = 2;//下载完成
private static final String TAG = "UpdateManager";
private int progress;//进度
private Thread downLoadThread;//下载线程
public static boolean interceptFlag = false;//是否中断
public UpdateDialog(Context context,String apkurl)
{
super(context);this.apkurl+=apkurlmContext=context;
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.update_dialog);
download=(Button)findViewById(R.id.down);
cancel=(Button)findViewById(R.id.downcan);
mProgress=(ProgressBar)findViewById(R.id.progress_update);
download.setOnClickListener(this);
cancel.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId())
{
case R.id.down://点击下载
downloadApk();
dismiss();
break;
case R.id.downcan://取消下载
interceptFlag =true;
dismiss();
break;
default:
break;
}}
/** * 下载apk */
private void downloadApk()
{
downLoadThread = new Thread(mdownApkRunnable);
downLoadThread.start();
}
///** * 安装apk */
private void installApk()
{
File apkfile = new File(saveFileName);
if (!apkfile.exists())
{
return;
}
Intent i = new Intent();
i.setAction("android.intent.action.VIEW");
i.addCategory("android.intent.category.DEFAULT");
i.setType("application/vnd.android.package-archive");
i.setData(Uri.parse("file://" + apkfile.toString()));
i.setDataAndType(Uri.parse("file://" + apkfile.toString()),"application/vnd.android.package-archive");
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);mContext.startActivity(i);
}
private Runnable mdownApkRunnable = new Runnable()
{
@Override
public void run()
{
try {
URL url = new URL(apkurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect();
int length = conn.getContentLength();
InputStream is = conn.getInputStream();
File file = new File(savePath);
if (!file.exists()) {
file.mkdir();
}
String apkFile = saveFileName;
File ApkFile = new File(apkFile);
FileOutputStream fos = new FileOutputStream(ApkFile);
int count = 0;
byte buf[] = new byte[1024];
do {
int numread = is.read(buf);
count += numread;
progress = (int) (((float) count / length) * 100);
// 更新进度//
mHandler.sendEmptyMessage(DOWN_UPDATE);
if (numread <= 0) {
// 下载完成通知安装
mHandler.sendEmptyMessage(DOWN_OVER);break;
}
fos.write(buf, 0, numread);
} while (!interceptFlag);
// 点击取消就停止下载.
fos.close();is.close();
}
catch (MalformedURLException e)
{}
catch (IOException e)
{}}};
private Handler mHandler = new Handler()
{
public void handleMessage(Message msg)
{
switch (msg.what) {
case DOWN_UPDATE:
mProgress.setProgress(progress);
break;
case DOWN_OVER:
//下载完成
dismiss();
installApk();
break;
default:break;
}};};}