Android應用檢查更新下載安裝打開

一、效果

低版本1.02


檢測到新版本1.03

調用android的安裝activity頁面



安裝完成



打開

1.03版本


二、注意

必須使用簽名的應用。因為android不管是虛擬機還是真機安裝應用都需要簽名。

在開發時,我們運行程序時,開發環境ADT會自動給我們加入一個默認的開發簽名,所以我們不需要手動導出簽名應用。

三、步驟

1、編寫更新文件update.json

2、編寫更新代碼

3、導出低版本簽名應用(1.02)

4、adb命令安裝低版本簽名應用

5、導出高版本簽名應用(1.03),放到tomcat服務器上

6、自動更新安裝升級

四、各步驟詳情

4.1編寫更新文件update.json

{
"versonName":"1.03",
"versonCode":3,
"description":"新增了很多功能,更新體驗吧!",
"downloadUrl":"http://10.0.2.2:8080/android/ZMGMobileSafe1.03.apk"
}

4.2編寫更新代碼

檢查更新的功能
/***檢查是否有新的版本*/private void checkNewVersion(){new Thread(){public void run() {long startTime=System.currentTimeMillis();//Android推薦使用,這個方法會先檢測是否存在message實例,如果存在直接用,如果沒有存在則new一個。//Android系統默認有10個實例Message msg=Message.obtain();String url="http://10.0.2.2:8080/android/update.json";try {//訪問服務器獲取jsonString result=HttpConnectionUtils.get(url);//解析json字符串JSONObject js=new JSONObject(result);mVersonName = js.getString("versonName");mVersonCode = js.getInt("versonCode");mDescription = js.getString("description");mDownloadUrl = js.getString("downloadUrl");//比較服務器版本號和應用的版本號if(mVersonCode>getVersionCode()){msg.what=CODE_UPDATE_DIALOG;}else{msg.what =CODE_ENTER_HOME;}} catch (MalformedURLException e) {//url格式錯誤msg.what=CODE_URL_ERROR;e.printStackTrace();} catch (IOException e) {//網絡異常msg.what=CODE_NET_ERROR;e.printStackTrace();}catch (JSONException e) {//json格式錯誤msg.what=CODE_JSON_ERROR;e.printStackTrace();}finally{//不能讓閃屏頁太快閃過去,強制等待long endTime=System.currentTimeMillis();long usedTime=endTime-startTime;if(usedTime<3000){try {Thread.sleep(3000-usedTime);} catch (InterruptedException e) {e.printStackTrace();}}mHandler.sendMessage(msg);}}}.start();}

HttpConnectionUtils.java
/*** http-get的方式獲取數據* @param url 訪問地址* @return 字符串* @throws MalformedURLException */public static String get(String url) throws MalformedURLException,IOException{String result="";//MalformedURLException 不正確的url地址異常URL connUrl=new URL(url);HttpURLConnection conn=(HttpURLConnection) connUrl.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(5000);//設置連接超時,如果5秒連不上,就不連接了,拋IOExceptionconn.setReadTimeout(5000);//設置讀取超時,雖然連接上了,但是服務器5秒了還不給反應,也就不等了,拋IOExceptionconn.connect();int responseCode=conn.getResponseCode();if(responseCode==HttpURLConnection.HTTP_OK){//讀取響應頭里的輸入流InputStream ins=conn.getInputStream();result=StreamUtils.readFromStream(ins);}if(conn!=null){conn.disconnect();}return result;}

private void ShowUpdateDialog(){AlertDialog.Builder builder=new AlertDialog.Builder(this);builder.setTitle(getText(R.string.updateTitle)+mVersonName);builder.setMessage(mDescription);//設置當點擊退回鍵的時候,對話框不關閉builder.setCancelable(false);//設置確定按鈕的點擊事件builder.setPositiveButton("立即升級", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {System.out.println("點擊了立即升級");downLoad();}});builder.setNegativeButton("以后再說", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {enterHome();}});//用戶點擊返回鍵時觸發,點擊了返回鍵則進入主界面builder.setOnCancelListener(new OnCancelListener() {@Overridepublic void onCancel(DialogInterface dialog) {enterHome();}});//這句話不能忘記哦,是把對話框顯示出來builder.show();}


代碼中用到了xUtils框架的httpUtils模塊下載功能
private void downLoad() {//檢查SD卡是否準備好了if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){tvProgress.setVisibility(View.VISIBLE);//顯示進度條String target=Environment.getExternalStorageDirectory()+"/safeUpdate.apk";//xUtilsHttpUtils utils=new HttpUtils();utils.download(mDownloadUrl, target, new RequestCallBack<File>() {@Overridepublic void onLoading(long total, long current,boolean isUploading) {super.onLoading(total, current, isUploading);tvProgress.setText("下載進度:"+current/total*100+"%");}@Overridepublic void onSuccess(ResponseInfo<File> responseInfo) {/** 調用系統的安裝activity<activity android:name=".PackageInstallerActivity"android:configChanges="orientation|keyboardHidden"android:theme="@style/Theme.Transparent"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><data android:scheme="content" /><data android:scheme="file" /><data android:mimeType="application/vnd.android.package-archive" /></intent-filter></activity>*/Intent intent=new Intent();intent.setAction(Intent.ACTION_VIEW);intent.addCategory(Intent.CATEGORY_DEFAULT);intent.setDataAndType(Uri.fromFile(responseInfo.result), "application/vnd.android.package-archive");//startActivity(intent);//當用戶點擊了取消安裝,會返回結果,回調方法onActivityResultstartActivityForResult(intent, 0);//安裝完成后,提示完成、打開android.os.Process.killProcess(android.os.Process.myPid());}@Overridepublic void onFailure(HttpException error, String msg) {Toast.makeText(SplashActivity.this, "下載失敗!", Toast.LENGTH_SHORT).show();}});}else{Toast.makeText(this, "沒有找到SD卡", Toast.LENGTH_SHORT).show();}}

下載完成了安裝時,調用android系統的activity頁面,會顯示安裝頁面,有取消和安裝兩個按鈕。
/** 調用系統的安裝activity<activity android:name=".PackageInstallerActivity"android:configChanges="orientation|keyboardHidden"android:theme="@style/Theme.Transparent"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><data android:scheme="content" /><data android:scheme="file" /><data android:mimeType="application/vnd.android.package-archive" /></intent-filter></activity>*/Intent intent=new Intent();intent.setAction(Intent.ACTION_VIEW);intent.addCategory(Intent.CATEGORY_DEFAULT);intent.setDataAndType(Uri.fromFile(responseInfo.result), "application/vnd.android.package-archive");//startActivity(intent);//當用戶點擊了取消安裝,會返回結果,回調方法onActivityResultstartActivityForResult(intent, 0);//安裝完成后,提示完成、打開android.os.Process.killProcess(android.os.Process.myPid());

4.3,4 導出簽名應用

修改AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.zengmg.MobileSafe"android:versionCode="2"android:versionName="1.02">

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.zengmg.MobileSafe"android:versionCode="3"android:versionName="1.03">


具體導出步驟見博文:http://blog.csdn.net/zengmingen/article/details/49761469

4.6 安裝

如果報錯可能是簽名不一致問題

見博文:http://blog.csdn.net/zengmingen/article/details/49760359


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539950.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539950.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539950.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

lnmp解析php,搭建LNMP,可以解析PHP文件-Go語言中文社區

一、安裝 nginx1. yum -y install pcre-devel zlib-devel links 下載相應軟件可以使用rpm -qa 軟件名 來查看是否安裝成功??2.useradd -u 250 -M -s /sbin/nologin nginx 建立程序用戶&#xff0c;降低權限3.tar xf nginx-1.6.0.tar.gz -C /usr/src/nginx 解壓并指定…

Linux vi 編輯器常見命令的使用

Linux vi 編輯器常見命令的使用 Linux下的文本編輯器有很多種&#xff0c;vi 是最常用的&#xff0c;也是各版本Linux的標配。注意&#xff0c;vi 僅僅是一個文本編輯器&#xff0c;可以給字符著色&#xff0c;可以自動補全&#xff0c;但是不像 Windows 下的 word 有排版功能。…

給控件添加小圖標

一、效果 二、知識點 三、代碼 <TextViewstyle"style/ContentStyle"android:drawableLeft"android:drawable/star_big_on"android:gravity"center"android:text"遠程鎖屏:#*lockscreen*#" />

加速計算,為何會成為 AI 時代的計算力“新寵”

隨著科技的發展&#xff0c;處理大量數據和進行復雜計算的需求越來越高&#xff0c;人工智能、大數據和物聯網等領域更是如此&#xff0c;傳統的計算方式已經無法滿足這些需求。因此&#xff0c;加速計算作為一種現代計算方式&#xff0c;成了必要的手段。加速計算具有前所未有…

Java中nextfloat怎么用,關于java的nextFloat()后面跟一個nextLine()

ArrayList studentInfors new ArrayList();Scanner sc new Scanner(System.in);for (int i 0; i StudentInfor studentInfor new StudentInfor();System.out.print("請輸入學生學號&#xff1a;");studentInfor.setNum(sc.nextLine());System.out.print("請…

背景選擇器selector替換按鈕默認背景

一、效果 正常狀態 獲取焦點或按下 按鈕的背景圖片是.9圖&#xff0c;.9圖的制作過程&#xff0c;見下面博文 http://blog.csdn.net/zengmingen/article/details/50193245 二、步驟 模仿android自帶的按鈕控件編寫1、找到android自帶按鈕的樣式。D:\ADT\sdk\platforms\andro…

php 取數值整數的函數是,PHP取整數函數常用的四種方法小結

ceil — 進一法取整說明float ceil ( float value )返回不小于 value 的下一個整數&#xff0c;value 如果有小數部分則進一位。ceil() 返回的類型仍然是 float&#xff0c;因為 float 值的范圍通常比 integer 要大。例子 1. ceil() 例子echo ceil(4.3); // 5echo ceil(9.999);…

ios 獲取控件高度

2019獨角獸企業重金招聘Python工程師標準>>> 1.ios 獲取控件相對屏幕的位置 需要獲取的對象為view1&#xff0c;則該視圖相對屏幕的位置可使用下面方法實現&#xff1a; UIWindow * window[[[UIApplication sharedApplication] delegate] window]; CGRect rect[view…

php文件上傳前端頁面樣式,HTML實現美化上傳文件樣式

這篇文章介紹的內容是HTML實現美化上傳文件i樣式 &#xff0c;有著一定的參考價值&#xff0c;現在分享給大家&#xff0c;有需要的朋友可以參考一下傳統寫法上傳文件效果如下圖所示這個樣式調整了很長時間&#xff0c;最后結果都不盡人意。非常規寫法上傳文件上傳給真正的用于…

jquery mobile用代碼彈出dialog

一、點擊彈出dialog 見http://www.w3school.com.cn/jquerymobile/jquerymobile_pages.asp中“將頁面作為dialog”這節二、代碼彈出 思路&#xff1a;模擬一個點擊事件。1、在頁面上隱藏一個<a>,如下 <a id"test" href"#pagetwo" style"displ…

畢設開發日志2017-12-01-Scan超時

【前言】 本篇博客主要描述一下在開發過程中遇到的scan的超時問題。 【問題描述】 剛剛完成了對索引表的定義和建議&#xff0c;并且在單元測試中對該表進行插入和掃描時均未發現錯誤。但是在對該表進行整體更新時&#xff0c;需要在掃描weather表的過程中對該表進行不斷的更新…

ubuntu java 1.6 安裝,ubuntu 中安裝java jdk 1.6

--------------------------------------------------------------------------------------------本文系本站原創,歡迎轉載!轉載請注明出處:http://blog.csdn.net/gdt_a20/article/details/7307681-------------------------------------------------------------------------…

Oracle修改表結構字段名和字段長度

添加字段的語法&#xff1a;alter table tablename add (column datatype [default value][null/not null],….); 修改字段的語法&#xff1a;alter table tablename modify (column datatype [default value][null/not null],….); 刪除字段的語法&#xff1a;alter table tab…

php快速排序實現代碼,快速排序的算法php實現

function qsort(&$arr){_quick_sort($arr, 0, count($arr) - 1);}/*** 采用遞歸算法的快速排序。** param array $arr 要排序的數組* param int $low 最低的排序子段* param int $high 最高的排序字段*/function _quick_sort(&$arr, $low, $high){$low_data $arr[$low…

08-spring學習-annotation配置

利用annotation配置注入關系 為了更好的解釋此類存在的意義&#xff0c;下面通過一段習慣性的開發進行問題的描述&#xff0c;例如&#xff1a; 現在有一個IAdminService服務層&#xff0c;這個服務層要調用的是IAdminDAO和IRoleDAO兩個數據層操作&#xff0c;于是定義如下&…

JQuery 綁定select標簽的onchange事件

原文出處&#xff1a;http://blog.csdn.net/a5489888/article/details/20045175 使用jqm的change事件 <script src"jquery.min.js" type"text/javascript"></script> <script language"javascript" type"text/javascript&q…

Android 6.0 源代碼編譯實踐

前陣子去上海參加 Android 開發面試&#xff0c;被問及了 Android 的基本原理、常用組件背后的實現機制、設計模式等問題&#xff0c;我都回答地不好。面試時&#xff0c;老司機們常常問我對知識點“背后的實現代碼有沒有看&#xff1f;”。于是我就想著&#xff0c;回來要把 A…

php 鏈接遠程oracle,PHP連接遠程oracle輸出數據

遠程連接的連接字符串可以這樣寫oledbconnection 的連接字符串:providermsdaora;host192.168.1.1;data sourcemytest;user idsystem;passwordxxxprovider msdaora; 指明oledb 的提供者是oracle數據庫host 是遠程 oracle 數據庫所在服務器的ip地址&#xff0c;如果端口不是默認…

RNN介紹,較易懂

人類并不是每時每刻都從一片空白的大腦開始他們的思考。在你閱讀這篇文章時候&#xff0c;你都是基于自己已經擁有的對先前所見詞的理解來推斷當前詞的真實含義。我們不會將所有的東西都全部丟棄&#xff0c;然后用空白的大腦進行思考。我們的思想擁有持久性。 傳統的神經網絡并…

android虛擬機鼠標左鍵拖動會輸入C

不知道什么原因&#xff0c;突然出現這個情況&#xff0c;以為是虛擬機壞了。于是刪了&#xff0c;新建&#xff0c;問題還是存在。 問題原因&#xff1a; 后來發現&#xff0c;原來是今天開了有道詞典&#xff0c;又開啟了詞典的劃詞翻譯。 解決方法&#xff1a; 關閉劃詞翻譯…