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界面刷新
原理:
使用
//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;
}