亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

android中強制更新app實例代碼

發布時間:2020-10-20 04:54:06 來源:腳本之家 閱讀:790 作者:AndroidCQC 欄目:移動開發

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

第一種:jjdxm_update

GitHub地址:jjdxmashl/jjdxm_update

效果圖:

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

android中強制更新app實例代碼 

android中強制更新app實例代碼 

android中強制更新app實例代碼 

android中強制更新app實例代碼

簡介:

這是大神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實例代碼

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實例代碼

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.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();
  }

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

科尔| 视频| 宜阳县| 鄢陵县| 华阴市| 东宁县| 当阳市| 弥渡县| 射洪县| 临桂县| 高安市| 寿宁县| 永安市| 金门县| 科技| 凤翔县| 崇义县| 宜春市| 新乐市| 博客| 修武县| 专栏| 资讯| 交城县| 和林格尔县| 夹江县| 百色市| 清水县| 绥江县| 贡觉县| 金昌市| 太保市| 华宁县| 名山县| 来安县| 苏尼特右旗| 卓资县| 兴山县| 和林格尔县| 澄江县| 秦皇岛市|