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

首頁 > 系統 > Android > 正文

android中強制更新app實例代碼

2019-10-23 18:29:30
字體:
來源:轉載
供稿:網友

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

第一種:jjdxm_update

GitHub地址:jjdxmashl/jjdxm_update

效果圖:

點擊立即更新,程序會在后臺下載,通知欄有下載進度。這個時候手機系統很卡,可能由于是下載app的原因吧。下載完成后彈出安裝界面

android,app強制更新,強制更新,android實現強制更新

android,app強制更新,強制更新,android實現強制更新

android,app強制更新,強制更新,android實現強制更新

android,app強制更新,強制更新,android實現強制更新

簡介:

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

4種更新檢查類型

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

2種強制更新方式

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

上述4中更新檢查 結合 2種強制更新,適用于:上一個app版本有重大漏洞,修改在線 參數統一控制所有的app用戶,不更新就不可以使用app。

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

強制更新的使用

下面演示的是強制更新的情況,

android,app強制更新,強制更新,android實現強制更新

Step1:添加依賴庫

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

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

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

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

Step2-1 創建一個自動更新的配置類

 

方法+參數 含義
setCheckUrl(checkUrl) checkUrl:更新app的接口
setCheckJsonParser(new ParseData() {return update;} 只能返回Update類型,解析可以隨便解析,但要把解析到的數據賦值給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)// 可填:請求方式,默認為get請求        .setCheckUrl(checkUrl)// 必填:數據更新接口,方法有重載帶參數的setCheckUrl(checkUrl, params)        .setDialogLayout(R.layout.custom_update_dialog)//自定義的更新dialog        .setCheckJsonParser(new ParseData() {// 必填:用于從數據更新接口獲取的數據response中。解析出Update實例。以便框架內部處理          @Override          public Update parse(String response) {            Log.d(TAG, "response=" + response);            //解析json數據            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類型,否則報錯,所以我們要把解析的javaBean數據賦值給update,然后將update返回          }        });  }}

checkUrl:是放在tomcat中的

 

復制代碼 代碼如下:

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 解析更新接口返回的數據

上面我用的是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,直接創建這個類,右鍵Generate—>GsonFormat—>將json數據復制到編輯框中—>OK—>選中這些參數,即可生成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()方法中調用

UpdateConfig.init(this);

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

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

源碼下載:UpDateDemo2

第二種: 判斷VersionCode,xUtils實現下載

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

效果圖

android,app強制更新,強制更新,android實現強制更新

Step1: 請求更新接口,根據versionCode判斷是否更新

// 獲取本地版本號PackageManager packageManager = getPackageManager();try {  packageInfo = packageManager.getPackageInfo(getPackageName(), 0);} catch (NameNotFoundException e) {  e.printStackTrace();} finally {  nativeVversionCode = packageInfo.versionCode;}// 獲取服務器版本號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(), "獲取服務器版本失敗,請檢查網絡,/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(), "請安裝最新的版本");        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/204117.html">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: 調用系統安裝界面

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 墨竹工卡县| 兴安盟| 田东县| 许昌县| 合肥市| 临汾市| 施秉县| 安西县| 丁青县| 新余市| 新乡县| 大冶市| 荔浦县| 定襄县| 神木县| 永川市| 昌都县| 商水县| 无极县| 青川县| 济南市| 西畴县| 抚顺市| 嘉禾县| 达孜县| 马鞍山市| 合江县| 武陟县| 新巴尔虎右旗| 临漳县| 彰化县| 吉木萨尔县| 平山县| 乐清市| 江山市| 吉首市| 罗江县| 藁城市| 页游| 东平县| 江北区|