Android 一个强大实用的版本升级demo(thread+service+Notification)
2012-09-26 17:42
465 查看
点击马上更新
点击后台更新
效果apk:
TestVersionUpdate.apk (21.86
KB, 下载次数: 78)
源码:
versionUpdate.zip (90.25
KB, 下载次数: 1312)
第一步:获取本机app版本:
public int getVerCode(Context _context,String _package) {
int verCode = -1;
try {
verCode = _context.getPackageManager().getPackageInfo(
_package, 0).versionCode;
} catch (NameNotFoundException e) {
}
return verCode;
}
复制代码
第二步:线程从服务端下载当前版本以及升级提示:
public JSONObject getJsonObject(String Url) {
HttpClient client = new DefaultHttpClient();
StringBuilder sb = new StringBuilder();
String js = null;JSONObject son=null;
HttpGet myget = new HttpGet(Url);
try {
HttpParams params = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(params, 8000);
HttpResponse response = client.execute(myget);
BufferedReader reader = new BufferedReader(new InputStreamReader(
response.getEntity().getContent()));
for (String s = reader.readLine(); s != null; s = reader.readLine()) {
sb.append(s);
}
js = sb.toString();
son = new JSONObject(js);
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("异常-》下载转化JSON");
return null;
}
return son;
}
复制代码
第三步:进行版本号对比,若有新版本,进行版本升级提示,builder使用自定义view。
LinearLayout ll = (LinearLayout) LayoutInflater.from(TestVersionUpdateActivity.this).inflate(
R.layout.layout_loadapk, null);
pb = (ProgressBar) ll.findViewById(R.id.down_pb);
tv = (TextView) ll.findViewById(R.id.tv);
Builder builder = new Builder(TestVersionUpdateActivity.this);
builder.setView(ll);builder.setTitle("版本更新进度提示");
builder.setNegativeButton("后台下载",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent=new Intent(TestVersionUpdateActivity.this, VersionService.class);
startService(intent);
dialog.dismiss();
}
});
builder.show();
new Thread() {
public void run() {
loadFile("http://1.nightman.sinaapp.com/test/good.zip");
}
}.start();
复制代码
第四步,进行更新
public void loadFile(String url) {
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
HttpResponse response;
try {
response = client.execute(get);
HttpEntity entity = response.getEntity();
float length = entity.getContentLength();
InputStream is = entity.getContent();
FileOutputStream fileOutputStream = null;
if (is != null) {
File file = new File(Environment.getExternalStorageDirectory(),
"NightMan.apk");
fileOutputStream = new FileOutputStream(file);
byte[] buf = new byte[1024];
int ch = -1;
float count = 0;
while ((ch = is.read(buf)) != -1) {
fileOutputStream.write(buf, 0, ch);
count += ch;
sendMsg(1,(int) (count*100/length));
}
}
sendMsg(2,0);
fileOutputStream.flush();
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (Exception e) {
sendMsg(-1,0);
}
}
private void sendMsg(int flag,int c) {
Message msg = new Message();
msg.what = flag;msg.arg1=c;
handler.sendMessage(msg);
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {// 定义一个Handler,用于处理下载线程与UI间通讯
if (!Thread.currentThread().isInterrupted()) {
switch (msg.what) {
case 1:
pb.setProgress(msg.arg1);
loading_process = msg.arg1;
tv.setText("已为您加载了:" + loading_process + "%");
break;
case 2:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(Environment
.getExternalStorageDirectory(), "NightMan.apk")),
"application/vnd.android.package-archive");
startActivity(intent);
break;
case -1:
String error = msg.getData().getString("error");
Toast.makeText(TestVersionUpdateActivity.this, error, 1).show();
break;
}
}
super.handleMessage(msg);
}
};
复制代码
后台下载service循环handler
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 1为出现,2为隐藏
if(TestVersionUpdateActivity.loading_process>99){
notificationMrg.cancel(0);
stopSelf();
return;
}
if(TestVersionUpdateActivity.loading_process>old_process){
displayNotificationMessage(TestVersionUpdateActivity.loading_process);
}
new Thread() {
public void run() {
isFirstStart=false;
Message msg = mHandler.obtainMessage();
mHandler.sendMessage(msg);
}
}.start();
old_process =TestVersionUpdateActivity.loading_process;
}
};
复制代码
有需要改进的地方望大哥们多踢踢BUG
应部分朋友的需求,这边上一下服务端的代码
服务器端以PHP为例,输出一个JSON格式的字符串
<?php
echo '{ "version":2,
"content":[{"id":0,"text":"增加了摇一摇自动排列频道的功能"},
{"id":1,"text":"优化了拖拽缓冲的效果"},
{"id":2,"text":"改善了PATH菜单用户体验"},
{"id":3,"text":"添加了更多名人趣事"}
]}
';
相关文章推荐
- Android 一个强大实用的版本升级demo(thread+service+Notification)
- 版本升级demo(thread+service+Notification)
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)(转载)
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- Android 通知栏Notification的全面学习 (一个DEMO让你完全了解它)
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)