直接上代码:
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.net.Uri; import android.os.Environment; import android.os.Handler; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.ProgressBar; import com.iblueyeClient.R; import com.iblueyeClient.utils.Msg; public class UpdateManager { private Context mContext; // 返回的安装包url private String apkUrl = "http://www.iblueye.com/client/download/ibePhone.apk"; private Dialog noticeDialog; private Dialog downloadDialog; /* 下载包安装路径 */ private static final String savePath = Environment .getExternalStorageDirectory().getPath(); private static final String saveFileName = savePath + "/" + "ibePhone.apk"; private Thread downLoadThread; private boolean interceptFlag = false; public ProgressBar mProgress;/* 进度条与通知ui刷新的handler和msg常量 */ public int progress; private Handler handler; public UpdateManager(Context context, Handler h) { this.mContext = context; handler = h; } // 外部接口让主Activity调用 public void confirmUpdate() { AlertDialog.Builder builder = new Builder(mContext); builder.setTitle(R.string.update_version); builder.setMessage(R.string.update_msg); builder.setPositiveButton(R.string.download, new OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); showDownloadDialog(); } }); builder.setNegativeButton(R.string.next_download, new OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); handler.sendEmptyMessage(Msg.START); } }); noticeDialog = builder.create(); noticeDialog.show(); } private void showDownloadDialog() { final LayoutInflater inflater = LayoutInflater.from(mContext); View v = inflater.inflate(R.layout.progress, null); mProgress = (ProgressBar) v.findViewById(R.id.progress); AlertDialog.Builder builder = new Builder(mContext); builder.setTitle(R.string.update_version); builder.setView(v); builder.setNegativeButton(R.string.cancel, new OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); interceptFlag = true; handler.sendEmptyMessage(Msg.START); } }); downloadDialog = builder.create(); downloadDialog.show(); downloadApk(); } private Runnable mdownApkRunnable = new Runnable() { 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); /* 更新进度 */ handler.sendEmptyMessage(Msg.DOWN_UPDATE); Log.i("更新测试", "progress=" + progress); if (numread <= 0) { /* 下载完成通知安装 */ handler.sendEmptyMessage(Msg.DOWN_OVER); break; } fos.write(buf, 0, numread); } while (!interceptFlag);/* 点击取消就停止下载 */ fos.close(); is.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }; /** * 下载apk * * @param url */ private void downloadApk() { downLoadThread = new Thread(mdownApkRunnable); downLoadThread.start(); } /** * 安装apk * * @param url */ public void installApk() { File apkfile = new File(saveFileName); if (!apkfile.exists()) { return; } Intent apk = new Intent(Intent.ACTION_VIEW); apk.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive"); mContext.startActivity(apk); } public void uninstall(String pakageName) { Uri uri = Uri.parse(pakageName); Intent intent = new Intent(Intent.ACTION_DELETE, uri); mContext.startActivity(intent); } }
相关推荐
比如,为下载任务添加暂停和恢复功能,或者处理网络中断后的断点续传。此外,考虑到存储空间问题,可以设定最大下载文件大小,以及在后台进行下载任务以避免影响用户使用应用。 总之,Android应用开发中涉及软件的...
自动更新时应考虑用户体验,比如在网络状况差时不强制更新,提供断点续传功能,以及在用户不活跃时进行下载以避免占用带宽。 6. ** 安全性:** 自动更新也需要注意安全问题,确保更新服务器的安全性,防止恶意...
注意处理下载进度、错误重试以及断点续传。 5. **监听下载进度**: 可以通过监听下载流的字节数,实时更新进度,并可能通过BroadcastReceiver通知用户下载进度,但因“静默下载”,所以通常不会打扰用户。 6. **...
4. **断点续传**:为了应对网络不稳定的情况,很多App支持断点续传功能。即如果下载中断,下次启动下载时可以从上次中断的位置继续,而不是重新开始。 5. **安全验证**:下载完成后,App需要对下载的APK文件进行...
该项目的主要功能是自动扫描并加载设备上非系统的应用程序,允许用户以类似iPhone的方式进行卸载操作。在描述中提到,当用户长按应用图标时,会显示删除按钮,并且图标会呈现来回晃动的效果,增加交互的真实感。一旦...
`wget`是网络数据下载工具,支持断点续传,适用于后台下载大文件;`curl`则是一款多功能的命令行工具,不仅可以下载文件,还可以处理HTTP、FTP、SMTP等多种协议。 4. **自定义软件包**:如果你研究的是自己上传的轻...
首先,CodevisionAVR提供了全面的源代码编辑器,支持语法高亮、自动完成和错误检查,极大地提高了程序员的编写效率。用户可以方便地创建、编辑和调试C或汇编语言的项目。此外,它的项目管理功能使开发者能够轻松地...
- 在下载管理中,可能涉及进度记录、多线程下载、断点续传等问题。 这些笔记内容覆盖了Android开发的基础知识,包括系统架构、资源管理、数据库操作、测试方法以及数据共享,为初学者提供了全面的学习指导。
源码分析可以帮助我们理解文件传输的实现细节,如断点续传、错误处理等。 6. **设备控制** adb提供了丰富的shell命令,如`am`(应用管理)、`pm`(包管理)、`input`(模拟用户输入)等,通过这些命令,开发者可以...
- **安装和卸载应用**:使用`adb install`来安装APK,`adb uninstall`来卸载应用。 - **远程 shell**:通过`adb shell`进入设备的命令行环境,执行各种Linux命令。 - **日志记录**:`adb logcat`用于收集和查看...
- **应用安装与调试:** 在开发过程中,开发者通常使用adb快速安装APK文件,同时配合DDMS(Dalvik Debug Monitor Service)进行断点调试,查看变量值、调用堆栈等信息。 - **远程调试:** 当设备无法直接连接到...
|--多线程下载及断点续传 |--多线程之AsyncTask的用法 |--多线程之线程池ExecutorService |--字体为粗体 |--安卓下的多线程断点上传 |--对话框与进度条结合用法 |--屏幕之Activity全屏 |--屏幕之横竖屏切换 |--屏幕...
6. 快速安装和卸载应用:开发者可以直接使用adb快速安装apk文件,无需通过Google Play或其他第三方市场。同样,也可以通过adb卸载已安装的应用。 7. 端口转发:adb支持端口转发功能,可以让开发者将设备的网络服务...
开发者可以通过ADB执行各种操作,如安装应用、卸载应用、查看设备状态、传输文件以及最重要的——调试应用。 无线调试Android应用的优点在于,它摆脱了USB连接的限制,使得远程调试和多设备管理变得更加便捷。以下...