国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

android中強(qiáng)制更新app實(shí)例代碼

2019-12-12 02:56:03
字體:
供稿:網(wǎng)友

推薦第三種方式,簡單快捷不卡。

第一種:jjdxm_update

GitHub地址:jjdxmashl/jjdxm_update

效果圖:

點(diǎn)擊立即更新,程序會(huì)在后臺(tái)下載,通知欄有下載進(jìn)度。這個(gè)時(shí)候手機(jī)系統(tǒng)很卡,可能由于是下載app的原因吧。下載完成后彈出安裝界面

這里寫圖片描述 

這里寫圖片描述 

這里寫圖片描述 

這里寫圖片描述

簡介:

這是大神jjdxmashl的開源項(xiàng)目,下載地址見上方。有版本更新、手動(dòng)更新、靜默更新、自動(dòng)更新4種情況。應(yīng)用內(nèi)更新,實(shí)現(xiàn)類是友盟自動(dòng)更新sdk的模式,用戶使用前只需要配置自己的服務(wù)器更新檢查接口即可(必須接口),也可以擴(kuò)展加入一個(gè)接口作為在線參數(shù)配置來實(shí)現(xiàn),可以實(shí)現(xiàn)下面的4種2更新方式和是否強(qiáng)制更新組合使用,支持get、post方式請(qǐng)求網(wǎng)絡(luò),默認(rèn)是get請(qǐng)求。

4種更新檢查類型

  1. 手動(dòng)更新:手動(dòng)檢測更新(所有網(wǎng)絡(luò)類型環(huán)境檢測并提示主要用于點(diǎn)擊檢測使用)
  2. 自動(dòng)更新:自動(dòng)檢測更新(所有網(wǎng)絡(luò)類型環(huán)境檢測并提示)
  3. 僅WiFi自動(dòng)檢測更新(只有WiFi網(wǎng)絡(luò)類型環(huán)境檢測并提示)
  4. 靜默更新:僅WiFi自動(dòng)檢測下載(只有WiFi網(wǎng)絡(luò)類型環(huán)境檢測、下載完才提示)

2種強(qiáng)制更新方式

  1. 在更新檢查返回后,直接設(shè)置update.setForce(true)
  2. 配合在線參數(shù)使用,通過在線參數(shù)返回的數(shù)據(jù)設(shè)置UpdateHelper.getInstance().setForced(true)

上述4中更新檢查 結(jié)合 2種強(qiáng)制更新,適用于:上一個(gè)app版本有重大漏洞,修改在線 參數(shù)統(tǒng)一控制所有的app用戶,不更新就不可以使用app。

主要原理:服務(wù)器上修改參數(shù)值,app端獲取后進(jìn)行判斷,如果是強(qiáng)制更新,則在打開應(yīng)用時(shí)就提示有新版本的app,更新完成后才可以使用該app;更新為完成,則提示框不消失,點(diǎn)擊back鍵則退出應(yīng)用。

強(qiáng)制更新的使用

下面演示的是強(qiáng)制更新的情況,

這里寫圖片描述

Step1:添加依賴庫

在主程序的build.gradle文件的dependencies屬性中添加依賴庫

dependencies {  ...  compile 'com.dou361.update:jjdxm-update:1.0.5'  compile 'com.dou361.download:jjdxm-download:1.0.3'  ...}

Step2:配置更新接口參數(shù)信息,初始化參數(shù)接口和解析參數(shù)

必須配置的是在線更新接口和該接口返回?cái)?shù)據(jù)的解析
可選的是在線參數(shù)接口和該接口返回?cái)?shù)據(jù)的解析(一般用不到),在線參數(shù)可以隨機(jī)定義零個(gè)或多個(gè)不同意義的參數(shù)來達(dá)到在線修改apk的部分特性。

Step2-1 創(chuàng)建一個(gè)自動(dòng)更新的配置類

方法+參數(shù) 含義
setCheckUrl(checkUrl) checkUrl:更新app的接口
setCheckJsonParser(new ParseData() {return update;} 只能返回Update類型,解析可以隨便解析,但要把解析到的數(shù)據(jù)賦值給update,再把update返回

public class UpdateConfig {  private static final String TAG = "UpdateConfig";  private static String checkUrl = "http://192.168.1.11:8080/cmcc/jsoninfo";  public static void init(Context context) {    UpdateHelper.init(context);    UpdateHelper.getInstance()        .setMethod(RequestType.get)// 可填:請(qǐng)求方式,默認(rèn)為get請(qǐng)求        .setCheckUrl(checkUrl)// 必填:數(shù)據(jù)更新接口,方法有重載帶參數(shù)的setCheckUrl(checkUrl, params)        .setDialogLayout(R.layout.custom_update_dialog)//自定義的更新dialog        .setCheckJsonParser(new ParseData() {// 必填:用于從數(shù)據(jù)更新接口獲取的數(shù)據(jù)response中。解析出Update實(shí)例。以便框架內(nèi)部處理          @Override          public Update parse(String response) {            Log.d(TAG, "response=" + response);            //解析json數(shù)據(jù)            Gson gson = new Gson();            UpDateBean upDateBean = gson.fromJson(response, UpDateBean.class);            UpDateBean.DataBean data = upDateBean.getData();            Update update = new Update();            update.setForce(data.isForce());            update.setApkSize(data.getV_size());            update.setUpdateContent(data.getUpdate_content());            update.setUpdateUrl(data.getDownload_url());            update.setVersionCode(Integer.parseInt(data.getV_code()));            update.setVersionName(data.getV_name());            return update;//只能返回Update類型,否則報(bào)錯(cuò),所以我們要把解析的javaBean數(shù)據(jù)賦值給update,然后將update返回          }        });  }}

checkUrl:是放在tomcat中的

復(fù)制代碼 代碼如下:

private static String checkUrl = "http://192.168.1.11:8080/cmcc/jsoninfo";

jsoninfo:

{  "code": 0,  "data": {    "download_url": "http://192.168.1.11:8080/cmcc/demo.apk ",    "force": false,    "update_content": "測試更新接口",    "v_code": 10,    "v_name": "v1.1",    "v_sha1": "7db76e18ac92bb29ff0ef012abfe178a78477534",    "v_size": 12365909  }}

Step2-2 解析更新接口返回的數(shù)據(jù)

上面我用的是Gson.jar,所以module的build.gradle還需要添加gson

dependencies {  ...  compile 'com.dou361.update:jjdxm-update:1.0.5'  compile 'com.dou361.download:jjdxm-download:1.0.3'  compile 'com.google.code.gson:gson:2.7'  ...}

javaBean類UpDateBean,直接創(chuàng)建這個(gè)類,右鍵Generate―>GsonFormat―>將json數(shù)據(jù)復(fù)制到編輯框中―>OK―>選中這些參數(shù),即可生成set() + get()方法。

public class UpDateBean {  /**   * code : 0   * data : {"download_url":"http://115.159.45.251/software/feibei_live1.0.0.16070810_zs.apk ","force":false,"update_content":"測試更新接口","v_code":"10","v_name":"v1.0.0.16070810","v_sha1":"7db76e18ac92bb29ff0ef012abfe178a78477534","v_size":12365909}   */  private int code;  /**   * download_url : http://115.159.45.251/software/feibei_live1.0.0.16070810_zs.apk   * force : false   * update_content : 測試更新接口   * v_code : 10   * v_name : v1.0.0.16070810   * v_sha1 : 7db76e18ac92bb29ff0ef012abfe178a78477534   * v_size : 12365909   */  private DataBean data;  public int getCode() {    return code;  }  public void setCode(int code) {    this.code = code;  }  public DataBean getData() {    return data;  }  public void setData(DataBean data) {    this.data = data;  }  public static class DataBean {    private String download_url;    private boolean force;    private String update_content;    private String v_code;    private String v_name;    private String v_sha1;    private int v_size;    public String getDownload_url() {      return download_url;    }    public void setDownload_url(String download_url) {      this.download_url = download_url;    }    public boolean isForce() {      return force;    }    public void setForce(boolean force) {      this.force = force;    }    public String getUpdate_content() {      return update_content;    }    public void setUpdate_content(String update_content) {      this.update_content = update_content;    }    public String getV_code() {      return v_code;    }    public void setV_code(String v_code) {      this.v_code = v_code;    }    public String getV_name() {      return v_name;    }    public void setV_name(String v_name) {      this.v_name = v_name;    }    public String getV_sha1() {      return v_sha1;    }    public void setV_sha1(String v_sha1) {      this.v_sha1 = v_sha1;    }    public int getV_size() {      return v_size;    }    public void setV_size(int v_size) {      this.v_size = v_size;    }  }}

Step3:在Application中oncreate()方法中調(diào)用

UpdateConfig.init(this);

Step4:在MainActivity的onCrete()中檢查更新

UpdateHelper.getInstance()    .setUpdateType(UpdateType.autoupdate)//自動(dòng)檢查更新    .setForceListener(new ForceListener() {//強(qiáng)制更新監(jiān)聽,true則退出app      @Override      public void onUserCancel(boolean force) {        if (force) {          finish();        }      }    })    .check(MainActivity.this);

源碼下載:UpDateDemo2

第二種: 判斷VersionCode,xUtils實(shí)現(xiàn)下載

根據(jù)versionCode判斷是否彈出更新dialog,需要更新的話,用戶點(diǎn)擊“確定”,利用xUtils實(shí)現(xiàn)下載,progressDialog顯示下載進(jìn)度,下載完成后,彈出是否安裝的dialog,是:安裝app,否:退出(MainActivity.this.finish())。

效果圖

這里寫圖片描述

Step1: 請(qǐng)求更新接口,根據(jù)versionCode判斷是否更新

// 獲取本地版本號(hào)PackageManager packageManager = getPackageManager();try {  packageInfo = packageManager.getPackageInfo(getPackageName(), 0);} catch (NameNotFoundException e) {  e.printStackTrace();} finally {  nativeVversionCode = packageInfo.versionCode;}// 獲取服務(wù)器版本號(hào)HttpUtils http = new HttpUtils();String url = "http://192.168.8.101:8080/QQ/jsoninfo";http.send(HttpMethod.POST, url, new RequestCallBack<String>() {  @Override  public void onFailure(HttpException exception, String msg) {    ToastUtil.showShortToast(getBaseContext(), "獲取服務(wù)器版本失敗,請(qǐng)檢查網(wǎng)絡(luò),/n App5秒后將退出");    handler.sendEmptyMessageDelayed(123, 5000);  }  @Override  public void onSuccess(ResponseInfo<String> respinseInfo) {    try {      JSONObject obj = new JSONObject(respinseInfo.result);      remoteVersionCode = obj.getInt("versioncode");      if (remoteVersionCode > nativeVversionCode) {        ToastUtil.showLongToast(getBaseContext(), "請(qǐng)安裝最新的版本");        downLoadApp();      }     } catch (JSONException e) {      e.printStackTrace();    }   }});private Handler handler = new Handler(){  public void handleMessage(Message msg) {    if (msg.what == 123) {      MainActivity.this.finish();    }  };};

Step2: 下載最新版本

protected void downLoadApp() {  target = Environment.getExternalStorageDirectory().getAbsolutePath() + "/QQ.apk";  String url = "http://192.168.8.101:8080/QQ/QQ.apk";  HttpUtils http = new HttpUtils();  http.download(url, target, new RequestCallBack<File>() {    @Override    public void onFailure(HttpException exception, String msg) {      ToastUtil.showShortToast(getBaseContext(), "下載失敗");    }    @Override    public void onSuccess(ResponseInfo<File> responseInfo) {      dialog.dismiss();      ToastUtil.showShortToast(getBaseContext(), "下載成功");      // 安裝apk      installApk();    }    @Override    public void onLoading(long total, long current, boolean isUploading) {      super.onLoading(total, current, isUploading);      initProgressDialog(total,current);    }  });}

Step3: 安裝apk

protected void installApk() {  new AlertDialog.Builder(MainActivity.this)    .setTitle("版本更新")    .setMessage("最新版本正在更新中...")    .setCancelable(false)    .setPositiveButton("確定", new DialogInterface.OnClickListener() {      @Override      public void onClick(DialogInterface dialog, int which) {        //安裝app        Intent intent = new Intent();        intent.setAction("android.intent.action.VIEW");        intent.addCategory("android.intent.category.DEFAULT");        Uri data = Uri.parse("file://" + target);        intent.setDataAndType(data, "application/vnd.android.package-archive");        startActivity(intent);        MainActivity.this.finish();      }    })    .setNegativeButton("退出", new DialogInterface.OnClickListener() {      @Override      public void onClick(DialogInterface dialog, int which) {        MainActivity.this.finish();      }    }).show();}

Step4: 調(diào)用系統(tǒng)安裝界面

protected void initProgressDialog(long total, long current) {    dialog.setTitle("更新app");//設(shè)置標(biāo)題    dialog.setMessage("版本號(hào): "+ remoteVersionCode);//設(shè)置dialog內(nèi)容    dialog.setIcon(R.drawable.ic_launcher);//設(shè)置圖標(biāo),與為Title左側(cè)    dialog.setCancelable(false);//點(diǎn)擊空白處不可取消    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);// 水平線進(jìn)度條,STYLE_SPINNER:圓形進(jìn)度條    dialog.setMax((int) total);//最大值    dialog.setProgress((int) current);    dialog.show();  }

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宝兴县| 化德县| 巴中市| 深水埗区| 澄迈县| 阆中市| 固镇县| 长沙县| 萝北县| 都兰县| 彩票| 湘阴县| 南康市| 紫阳县| 白山市| 邓州市| 若尔盖县| 文化| 乐清市| 京山县| 株洲市| 临沭县| 枣庄市| 南靖县| 丰县| 仙游县| 沁源县| 大关县| 娄底市| 侯马市| 东兰县| 龙泉市| 宁强县| 青阳县| 珠海市| 老河口市| 彰化市| 南汇区| 卢湾区| 莫力| 新津县|