友好的视觉感知和稳定的不出错表现,来自于我们追求美感和考虑的全面性,博客园从技术的角度,一直我都很欣赏。
这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用。

这一篇是对上一篇《Android学习系列(2)--App自动更新之通知栏下载》的补充,因此只是以点为要,点到为止。
1.内部存储
    出于考虑到用户可能禁掉了SDCard或者电脑暂时插在电脑上且为磁盘连接状态等等,对于这么个情况下,我们应该也要保证我们的程序也是能正常的运行。所以我们要考虑内部存储。
    我暂时把内部存储定在/data/data/xxxxxappxxxx/files目录,核心代码如下:

1
2
3
4
5
6
7
8
//创建目录和文件
if(android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment.getExternalStorageState())){
    updateDir = new File(Environment.getExternalStorageDirectory(),Global.downloadDir);
}else{
    //files目录
    updateDir = getFilesDir();
}
updateFile = new File(updateDir.getPath(),getResources().getString(titleId)+".apk");

2.内部存储的权限
  一起都运行的正常,但是当我们帮下下来的apk文件执行运行操作的时候,确提示如下,
 
    "解析包错误"??其实你下载的文件并不一定就是坏的或者错误的,也可能是android系统的权限在作怪。在你执行之前,加上如下核心代码:

1
2
3
4
5
6
String cmd = "chmod +x " +updateFile.getPath();
try {
    Runtime.getRuntime().exec(cmd);
} catch (IOException e) {
    e.printStackTrace();
}

3.通知栏显示进度条组件的一个bug。
    在通知栏设置进度条的可见性,会无缘无故的崩溃。

1
2
3
//下面一句是没有语法错误的,但是会导致程序出错
//为了解决这个问题,后面我们会再progressView外面包裹一层LinearLayout来控制可见性
updateNotification.contentView.setViewVisibility(progressViewID, View.GONE);

4.自定义进度条显示视图。
    布局文件updata_nitification.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:layout_weight="2"
android:paddingLeft="5dip">
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="left|center_vertical"
android:orientation="horizontal"
android:layout_weight="1">
<ImageView android:src="@drawable/icon"
android:layout_width="24dip"
android:layout_height="fill_parent"
android:scaleType="fitCenter"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:textColor="#000000"
android:paddingLeft="5dip"
android:textSize="16dip"/>
</LinearLayout>
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="left"
android:orientation="horizontal"
android:layout_weight="1">
<TextView android:id="@+id/update_notification_progresstext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#8F8F8F"
android:textSize="14dip"/>
<LinearLayout android:id="@+id/update_notification_progressblock"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ProgressBar android:id="@+id/update_notification_progressbar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>

开始下载:

        updateNotification.contentIntent = updatePendingIntent;
updateNotification.contentView.setProgressBar(com.cnblogs.tianxia.subway.R.id.update_notification_progressbar, 100, 0, false);
updateNotification.contentView.setTextViewText(com.cnblogs.tianxia.subway.R.id.update_notification_progresstext, "0%");

正在下载,显示下载进度条:

                        updateNotification.contentView.setProgressBar(com.cnblogs.tianxia.subway.R.id.update_notification_progressbar, 100, (int)(totalSize*100/updateTotalSize), false);
updateNotification.contentView.setTextViewText(com.cnblogs.tianxia.subway.R.id.update_notification_progresstext, (int)(totalSize*100/updateTotalSize)+"%");
updateNotificationManager.notify(0, updateNotification);

下载完成,点击可以安装:

                    //点击安装PendingIntent
Uri uri = Uri.fromFile(updateFile);
Intent installIntent = new Intent(Intent.ACTION_VIEW);
installIntent.setDataAndType(uri, "application/vnd.android.package-archive");
updatePendingIntent = PendingIntent.getActivity(UpdateService.this, 0, installIntent, 0); updateNotification.defaults = Notification.DEFAULT_SOUND;//铃声提醒
updateNotification.contentIntent = updatePendingIntent;//安装界面
updateNotification.contentView.setViewVisibility(com.cnblogs.tianxia.subway.R.id.update_notification_progressblock, View.GONE);
updateNotification.contentView.setTextViewText(com.cnblogs.tianxia.subway.R.id.update_notification_progresstext, "下载完成,点击安装!");
updateNotificationManager.notify(0, updateNotification);

效果图如下:
   如果你喜欢的话,请推荐一下,谢谢大家的支持!

作者:谦虚的天下

Android学习系列(3)--App自动更新之自定义进度视图和内部存储的更多相关文章

  1. Android学习系列(2)--App自动更新之通知栏下载

    这篇文章是Android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用.1.设计思路,使用VersionCode定义为版本升级参数. android为我们定义版本提供了2个属性:& ...

  2. Android学习系列(7)--App轮询服务器消息

    这篇文章是android开发人员的必备知识. 1.轮询服务器     一般的应用,定时通知消息可以采用轮询的方法从服务器拿取消息,当然实时消息通知的话,建议采用推送服务.    其中需要注意轮询的频率 ...

  3. Android学习系列(17)--App列表之圆角ListView(续)

    http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html   本来这篇文章想并到上篇Android学习系列(16)- ...

  4. Android学习系列(11)--App列表之拖拽ListView(下)

    接着上篇Android学习系列(10)--App列表之拖拽ListView(上)我们继续实现ListView的拖拽效果. 7.重写onTouchEvent()方法.     在这个方法中我们主要是处理 ...

  5. Android学习系列(37)--App调试内存泄露之Context篇(下)

    接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...

  6. Android学习系列(15)--App列表之游标ListView(索引ListView)

    游标ListView,提供索引标签,使用户能够快速定位列表项.      也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧.      一看图啥都懂了: 1. ...

  7. Android学习系列(23)--App主界面实现

    在上篇文章<Android学习系列(22)--App主界面比较>中我们浅略的分析了几个主界面布局,选了一个最大众化的经典布局.今天我们就这个经典布局,用代码具体的实现它. 1.预览图先看下 ...

  8. Android学习系列(18)--App工程结构搭建

     本文算是一篇漫谈,谈一谈关于Android开发中工程初始化的时候如何在初期我们就能搭建一个好的架构.      关于android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的 ...

  9. Android学习系列(10)--App列表之拖拽ListView(上)

     研究了很久的拖拽ListView的实现,受益良多,特此与尔共飨.      鉴于这部分内容网上的资料少而简陋,而具体的实现过程或许对大家才有帮助,为了详尽而不失真,我们一步一步分析,分成两篇文章. ...

随机推荐

  1. mahout源码分析之DistributedLanczosSolver(五)Job over

    Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 1. Job 篇 接上篇,分析到EigenVerificationJob的run方法: public i ...

  2. cocos2d-x-3.1 win32程序-初识源代码(coco2d-x 学习笔记二)

    本人吊丝一枚.没钱买mac电脑,仅仅能使用Visual Studio2013来开发cocos2d-x项目.当然也能够用eclipse来开发,可是开发与配置步骤要复杂的多,而且非常多功能没有其好.也是官 ...

  3. Android -- Fragment注意事项

    ViewPager+Fragment 让Fragment成为ViewPager的一页时,FragmentManager会一直保存管理创建好了的Fragment,即使当前不是显示的这一页,Fragmen ...

  4. 关于帝国CMS迁移到新服务器上出现问题的处理办法

    在帝国CMS项目整体迁移过程中,或多或少总会出点幺蛾子,以下就常见的注意事项整理一下: 一.修改 e/config/config.php中的数据库相关配置 二.让项目文件位置具有读写权限 三.设置ph ...

  5. MySql无法远程登录以及IP被锁解决办法

    授权 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '' WITH GRANT OPTION;Query OK, 0 rows aff ...

  6. Reduce Task的学习笔记

    MapReduce五大过程已经分析过半了.上次分析完Map的过程,着实花费了我的非常多时间.只是收获非常大,值得了额,这次用相同的方法分析完了Reduce的过程,也算是彻底摸透了MapReduce思想 ...

  7. [Backbone]1. Module, View classed

    Welcome to the Anatomy of Backbone.js challenges! We're going to be building a simple Appointment ap ...

  8. java基础-类变量,类方法

  9. T-SQL 之 自定义函数

    和存储过程很相似,用户自定义函数也是一组有序的T-SQL语句,UDF被预先优化和编译并且作为一个单元进行调用.UDF和存储过程的主要区别在于返回结果的方式. 使用UDF时可传入参数,但不可传出参数.输 ...

  10. openfire 用户名+密码 配置

    安装了openfire后要求配置,通常用户名都是admin,密码是安装时用户所设定的密码.由于种种原因会出现无法登陆的现象.现有两种方法可以解决. 1. 进入openfire的安装目录下---> ...