1.1. 摘要

软件由于功能,版本稳定等原因,用户不能及时地安装最新的软件,本功能提供在线的一键安装功能,这样用户就可以安装最新软件,享受最新软件服务。

 比方:

追MM

知道自己的年龄,

1.2. 思路

 

软件自动更新功能思路与开发要点_自动更新

1.3. 开发步骤

1.测试接口OK

2.HttpURLConnection发请求 get

3.通过PullParser解析xml得到更新信息

4.通过PackageManager取得本地版本号

5.逻辑判断两个版本号是否要下载

6.下载 弹出框提示框,显示 PorgressDialog,调用安装界面

7.不下载 进入主页

1.4. 开发要点

1.4.1. 联网

>权限

<!-- 网络访问权限 -->
<uses-permission android:name="android.permission.INTERNET" />

>代码编写  

耗时

// 创建地址对象
URL url = new URL(urlStr);
// 打开链接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 参数
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
if (conn.getResponseCode() == 200) {
InputStream input = conn.getInputStream();
}

>创建子线程

在项目开发过程中需要区别哪些代码是耗时的需要用异步优化

new Thread() {
public void run() {
try {
Looper.prepare();//Looper轮询器 准备
//耗时代码
} catch (Exception e) {
e.printStackTrace();
//异常处理
};
}.start();


1.4.2. 数据解析xml

//创建解PullParser析器
XmlPullParser parser = Xml.newPullParser();
//设置数据
parser.setInput(input, "UTF-8");
int eventType = XmlPullParser.START_DOCUMENT;
// 逐行
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_TAG:// 标签开始
if ("versionCode".equals(parser.getName()//获取标签名
)) {
mUpdateInfo.versionCode = parser.nextText();//获取文本值
...
break;
}
// 执行下一行
eventType = parser.next();
}


1.4.3. IntentFilter参数

思考

想要在Internet查找服务 找地址 带上参数,在Android系统里调用Activity有三个重要参数

Action, Catergory,data

// 查找Activity
Intent intent = new Intent();
// 动作
intent.setAction(Intent.ACTION_VIEW);
// 类别
intent.addCategory(Intent.CATEGORY_DEFAULT);
// apk mimeType "application/vnd.android.Package-archive"
// 参数
intent.setDataAndType(Uri.fromFile(apk), "application/vnd.android.Package-archive");
startActivity(intent);


通过意图过滤器发布Activity

<activity
android:name="cn.itcast.safe.act.InstallActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.Light.NoTitleBar" >
<intent-filter>
<!-- 动作 -->
<action android:name="android.intent.action.VIEW" />
<!-- 类别 -->
<category android:name="android.intent.category.DEFAULT" />
<!-- 参数 -->
<data android:mimeType="application/vnd.android.Package-archive" />
</intent-filter>
</activity>

1.4.4. Handler界面刷新


原理:



软件自动更新功能思路与开发要点_android_02



使用

//Message Message = new Message();
Message Message = hanlder.obtainMessage();//建议使用
//先判断是否在存创建过的Message 如果存就重用 优化内存
Message.what = 1;// 打开对话框
hanlder.sendMessage(Message);

事件处理

// 更新界面
private Handler hanlder = new Handler() {
// 回调函数:条件:sendMessage
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:// 打话对话框
//操作UI
openUpdateDialog();
break; ......
}
};
};

1.4.5. 两个上下文与注意问题

弹框弹在哪个界面,把这个Activity传递过去这种方说是OK的!!!

AlertDialog.Builder builder = new AlertDialog.Builder(this);


 上下文比较

1.this Activity上下文 弹框弹在哪个Activity上面,把这个Activity传给Dialog 

2.getApplicationContext(); 应用上下文

3.getBaseContext(); // setBaseContext(); 不是Activity

注意:findViewById

findViewById 从ContentView

view. findViewById  从view对象里面找

setProgress在子线程也能用?

TextView  setText();//内部没有用Handler更新

ProgressBar  setProgress();//内部使用Hanlder界面更新 sendMess年龄 可以在子线程里面使用

While的优化

在while循环里使用sendMessage 容易内存OOM OutOfMemorryError内存溢出错误

查看线程是否是main

System.out.println(Thread.currentThread().getName());// main

1.4.6. 本地版本号获取

public int getLocalVersionNumber() {
int versioncode = 1;
// 增删查 PackageDao
try {
// 获取包管理器
PackageManager Manager = getPackageManager();
// 获取版本信息
PackageInfo info = Manager.getPackageInfo(getPackageName(),// 包名
0// 默认0
);
versioncode = info.versionCode;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
System.out.println("本地版本号" + versioncode);
return versioncode;
}