android中的更新功能实现
来源:互联网 发布:淘宝网ang卫衣 编辑:程序博客网 时间:2024/06/11 20:20
转自:Android apk更新,下载,安装
更新的思想一般都是从服务器获取到版本号,再和当前使用的app的版本号进行比较,如果不同,就进行提示更新;
activity中:
public class UpdateAppActivity extends BaseActivity {private String url="http://192.168.56.1:8080/apk/AppName.apk"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_update_app); alertUpdate(); } public void alertUpdate() { AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle("软件升级").setMessage("发现新版本,建议立即更新使用.") .setPositiveButton("更新", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { File file = new File(UpdateAppService.save_url + "/AppName.apk"); if (file.exists()) { Uri uri = Uri.fromFile(file); Intent intent2 = new Intent(Intent.ACTION_VIEW); intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent2.setDataAndType(uri, "application/vnd.android.package-archive"); UpdateAppActivity.this.startActivity(intent2); } else { Intent intent = new Intent(UpdateAppActivity.this, UpdateAppService.class); intent.putExtra("Key_App_Name", "AppName"); intent.putExtra("Key_Down_Url", url); startService(intent); } } }).setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); alert.create().show(); }}
在这里我们是用的是底层服务来进行下载,
service:
public class UpdateAppService extends Service{ private String app_name;// 文件名 private String down_url;// 下载文件地址 public static String save_url = Environment.getExternalStorageDirectory() + "/Louyx"; private static final int TIMEOUT = 10 * 1000;// 超时 private static final int DOWN_OK = 1; private static final int DOWN_ERROR = 0; // 通知 private NotificationManager notificationManager; private Notification notification; private RemoteViews contentView; @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { app_name = intent.getStringExtra("Key_App_Name"); down_url = intent.getStringExtra("Key_Down_Url"); if (FileUtils.createFile(save_url, app_name)) { createNotification(); // 线程开启 new DownLoadThread().start(); } else { stopSelf(); } return super.onStartCommand(intent, flags, startId); } public void createNotification() { notification = new Notification(R.mipmap.ic_launcher, app_name + "正在下载", System.currentTimeMillis()); notification.flags = Notification.FLAG_ONGOING_EVENT; // 自定义 Notification 的显示 contentView = new RemoteViews(getPackageName(),R.layout.test_notification_item); contentView.setTextViewText(R.id.notificationTitle, app_name + "正在下载"); contentView.setTextViewText(R.id.notificationPercent, "0%"); contentView.setProgressBar(R.id.notificationProgress, 100, 0, false); notification.contentView = contentView; notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(R.layout.test_notification_item, notification); } private class DownLoadThread extends Thread { @Override public void run() { Message message = new Message(); try { long downloadSize = downloadUpdateFile(down_url, FileUtils.updateFile.toString()); if (downloadSize > 0) { message.what = DOWN_OK; handler.sendMessage(message); } } catch (Exception e) { e.printStackTrace(); message.what = DOWN_ERROR; handler.sendMessage(message); } } } public long downloadUpdateFile(String down_url, String file) throws Exception { int totalSize; // 文件总大小 int downloadCount = 0; // 已经下载好的大小 int updateCount = 0; // 已经上传的文件大小 int downCount = 1;// 已下载好的百分比 InputStream inputStream=null; OutputStream outputStream=null; URL url = new URL(down_url); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); url.openConnection(); httpURLConnection.setConnectTimeout(TIMEOUT); httpURLConnection.setReadTimeout(TIMEOUT); // 获取下载文件的总管大小size totalSize = httpURLConnection.getContentLength(); if (httpURLConnection.getResponseCode() == 404) { // 这个地方应该加一个下载失败的处理,但是,因为我们在外面加了一个try---catch,已经处理了Exception,所以不用处理 throw new Exception("fail!"); } if(httpURLConnection.getResponseCode()==200){ inputStream = httpURLConnection.getInputStream(); outputStream = new FileOutputStream(file, false);// 文件存在则覆盖掉 byte buffer[] = new byte[1024]; int readsize = 0; while ((readsize = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, readsize); downloadCount += readsize; int num = downloadCount * 100 / totalSize; if (num > downCount || totalSize == downloadCount) { downCount = downloadCount * 100 / totalSize; // 改变通知栏 contentView.setTextViewText(R.id.notificationPercent, downCount + "%"); contentView.setProgressBar(R.id.notificationProgress, 100, downCount, false); notification.contentView = contentView; notificationManager.notify(R.layout.test_notification_item, notification); } } } if (httpURLConnection != null) { httpURLConnection.disconnect(); } inputStream.close(); outputStream.close(); return downloadCount; } private final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case DOWN_OK: // 改变通知栏 contentView.setTextViewText(R.id.notificationTitle, app_name + "下载完成"); notification.contentView = contentView; notificationManager.notify(R.layout.test_notification_item, notification); //安装 Uri uri = Uri.fromFile(FileUtils.updateFile); Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(uri, "application/vnd.android.package-archive"); UpdateAppService.this.startActivity(intent); stopSelf(); break; case DOWN_ERROR: // 改变通知栏 FileUtils.delFile(save_url + "/" + app_name + ".apk"); contentView.setTextViewText(R.id.notificationTitle, app_name + "下载失败"); notification.contentView = contentView; notificationManager.notify(R.layout.test_notification_item, notification); stopSelf(); break; default: break; } } };}
一个简单地文件操作类:
FileUtils:
public class FileUtils { public static File updateDir; public static File updateFile; public static boolean createFile(String url, String name) { // 判断SD卡可读可写 if (android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment .getExternalStorageState())) { updateDir = new File(url + "/"); updateFile = new File(url + "/" + name + ".apk"); if (!updateDir.exists()) { updateDir.mkdirs(); } if (!updateFile.exists()) { try { updateFile.createNewFile(); } catch (Exception e) { e.printStackTrace(); return false; } } return true; } return false; } public static void delFile(String path) { File file = new File(path); if (file.exists()) { file.delete(); } }}
下载过程中的自定义通知栏布局文件:
test_notification_item
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/notificationImage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:drawable/stat_sys_download" android:paddingLeft="16dp"/> <TextView android:id="@+id/notificationTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_toRightOf="@id/notificationImage" android:paddingLeft="26dp" android:textColor="#FFFFFFFF" /> <!-- android:textColor="#FF000000" --> <TextView android:id="@+id/notificationPercent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/notificationImage" android:paddingTop="2dp" android:textColor="#FFFFFFFF" android:paddingLeft="16dp"/> <ProgressBar android:id="@+id/notificationProgress" style="?android:attr/progressBarStyleHorizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@id/notificationTitle" android:layout_alignParentRight="true" android:layout_alignTop="@id/notificationPercent" android:layout_below="@id/notificationTitle" android:paddingLeft="26dp" android:paddingRight="3dp" android:paddingTop="2dp" /></RelativeLayout>
0 0
- android中的更新功能实现
- android应用程序更新功能实现
- android实现软件的更新、安装功能
- Android 版本更新功能的实现
- Android 自动检测更新功能的实现
- 实现自动检测更新功能
- 实现数据库更新功能
- Android 5.0中的FDE功能实现
- Android中的一键退出功能实现
- Android中的调色板功能的实现
- Android中的一键退出功能实现
- Android自动检测更新功能
- android版本更新功能
- Android App更新功能
- android 版本更新功能
- android版本更新功能
- Android版本更新功能
- Android app“版本更新”功能的前后端实现
- 定时器 QuartZ Cron表达式
- @Override
- VBOX command
- 此证书的签发者无效
- 3dmax蒙皮后模型缩放问题解决笔记
- android中的更新功能实现
- 高斯消元练习
- 自定义控件(一)
- php 设计模式
- 集成七牛SDK的时候出现的错误 res_9_ninit crc32
- MyEclipse 10 使用优化方法
- JVM
- iOS Swift 和 Objective-c 两种语言对于多线程的详细解释
- 源代码查看工具:vim中ctags的使用(跳转查定义)