中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

如何在Android開發中中實現一個App更新功能

發布時間:2020-12-01 17:22:54 來源:億速云 閱讀:291 作者:Leah 欄目:移動開發

如何在Android開發中中實現一個App更新功能?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

開發環境:AndroidStudio2.1.2+gradle-2.10

部分代碼:

public class UpdateVersionController {
 private Context context;
 //更新文件的實例
 private AppUpdateInfo info;
 //當前版本號
 private int versionCode;
 //提示用戶更新的dialog
 private Dialog dialog;
 //下載進度條
 private ProgressDialog pd;

 public static UpdateVersionController getInstance(Context context) {
 return new UpdateVersionController(context);
 }
 public UpdateVersionController(Context context) {
 this.context = context;
 }
 public void normalCheckUpdateInfo() {
 //獲取版本號:這里的版本號在項目的build.gradle中是可以看到的,看復制過來的參數
 /**
 defaultConfig {
 applicationId "com.zhh.test"
 minSdkVersion 16
 targetSdkVersion 23
 versionCode 1
 versionName "1.0"
 }
 */
 versionCode = getVerCode(context);//等于19
 checkVersionTask();
 }
 public void forceCheckUpdateInfo() {//強制更新一般不用
 versionCode = getVerCode(context);//等于19
 info = new AppUpdateInfo();
 info.setUrl("http://60.210.21.89/appdl.hicloud.com/dl/appdl/application/apk/dd/ddeabc7e64d64e4287340ffb89c592a8/com.hellotext.1309171635.apk?sign=baidu@baidu&wshc_tag=0&wsts_tag=58c7bde2&wsid_tag=7c5a47c8&wsiphost=ipdbm");
 info.setVercode(2);//每次更新都靠它
 info.setVername("2.0");//版本名字
 info.setApkname("com.hellotext.1309171635.apk");
 info.setAppname("Hello");
 info.setForceUpp("yes");
 info.setUppcontent("1. Hello啊喲更新了\n2. 英文的,界面很好看.\n3. 界面效果優化");//更新內容
 updateApp();
 }
 /**
 * 步驟一:獲取版本信息
 */
 private void checkVersionTask() {
 //網絡加載獲取app新版版本信息
 //這里不做請求直接賦值
 info = new AppUpdateInfo();
 info.setUrl("http://60.210.21.89/appdl.hicloud.com/dl/appdl/application/apk/dd/ddeabc7e64d64e4287340ffb89c592a8/"+
            "com.hellotext.1309171635.apk?sign=baidu@baidu&wshc_tag=0&wsts_tag=58c7bde2&wsid_tag=7c5a47c8&wsiphost=ipdbm");
 info.setVercode(2);//每次更新都靠它
 info.setVername("2.0");//版本名字
 info.setApkname("com.hellotext.1309171635.apk");
 info.setAppname("Hello");
 info.setForceUpp("no");
 info.setUppcontent("1. Hello啊喲更新了\n2. 英文的,界面很好看.\n3. 界面效果優化");//更新內容
 updateApp();
 }
 private void updateApp() {
 if (null != info && info.getVercode() > versionCode) {//20>19可更新
 showUpdataDialog();
 } else {
 Toast.makeText(context, "已經是最新版本啦~", Toast.LENGTH_SHORT).show();
 }
 }
 private Button cancelBtn;
 /**
 * 步驟二:彈出對話框提示用戶更新
 */
 protected void showUpdataDialog() {
 dialog = new Dialog(context, android.R.style.Theme_Dialog);
 dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
 dialog.setContentView(R.layout.activity_updater);
 dialog.setCanceledOnTouchOutside(false);
 dialog.setCancelable(false);
 ((TextView) dialog.findViewById(R.id.content)).setText(info.getUppcontent());
 cancelBtn = (Button) dialog.findViewById(R.id.cancel);
 cancelBtn.setVisibility("yes".equals(info.getForceUpp()) ? View.GONE : View.VISIBLE);
 // 取消更新
 cancelBtn.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 dialog.dismiss();
 }
 });
 // 確認更新
 dialog.findViewById(R.id.ok).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 dialog.dismiss();
 downLoadApk();
 }
 });
 dialog.findViewById(R.id.market).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 Intent intent = new Intent(Intent.ACTION_VIEW);
 intent.setData(Uri.parse("market://details?id=Hello"));
 context.startActivity(intent);
 }
 });
 dialog.show();
 }
 /**
 * 步驟三:下載文件
 */
 private void downLoadApk() {
 // 進度條對話框
 pd = new ProgressDialog(context);
 pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
 pd.setMessage("下載中...");
 pd.setCanceledOnTouchOutside(false);
 pd.setCancelable(false);
 // 監聽返回鍵--防止下載的時候點擊返回
 pd.setOnKeyListener(new OnKeyListener() {
 @Override
 public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
 if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
 Toast.makeText(context, "正在下載請稍后", Toast.LENGTH_SHORT).show();
 return true;
 } else {
 return false;
 }
 }
 });
 // Sdcard不可用
 if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
 Toast.makeText(context, "SD卡不可用~", Toast.LENGTH_SHORT).show();
 } else {
 pd.show();
 //下載的子線程
 new Thread() {
 @Override
 public void run() {
 try {
 // 在子線程中下載APK文件
 File file = getFileFromServer(info.getUrl(), pd);
 sleep(1000);
 // 安裝APK文件
 installApk(file);
 pd.dismiss(); // 結束掉進度條對話框
 } catch (Exception e) {
 Toast.makeText(context, "文件下載失敗了~", Toast.LENGTH_SHORT).show();
 pd.dismiss();
 e.printStackTrace();
 }
 }
 }.start();
 }
 }
 /**
 * 從服務器下載apk
 */
 public File getFileFromServer(String path, ProgressDialog pd) throws Exception {
 // 如果相等的話表示當前的sdcard掛載在手機上并且是可用的
 if (Environment.getExternalStorageState().equals(
 Environment.MEDIA_MOUNTED)) {
 URL url = new URL(path);
 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
 conn.setConnectTimeout(5000);
 // 獲取到文件的大小
 pd.setMax(conn.getContentLength() / 1024);
 InputStream is = conn.getInputStream();

 File file = new File(Environment.getExternalStorageDirectory().getPath()
 + "/blibao/merchant", "i_blibao_shop.apk");
 //判斷文件夾是否被創建
 if (!file.getParentFile().exists()) {
 file.getParentFile().mkdirs();
 }
 FileOutputStream fos = new FileOutputStream(file);
 BufferedInputStream bis = new BufferedInputStream(is);
 byte[] buffer = new byte[1024];
 int len;
 int total = 0;
 while ((len = bis.read(buffer)) != -1) {
 fos.write(buffer, 0, len);
 total += len;
 // 獲取當前下載量
 pd.setProgress(total / 1024);
 }
 fos.close();
 bis.close();
 is.close();
 return file;
 } else {
 return null;
 }
 }
 /**
 * 安裝apk
 */
 protected void installApk(File file) {
 Intent intent = new Intent();
 // 執行動作
 intent.setAction(Intent.ACTION_VIEW);
 // 執行的數據類型
 intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 context.startActivity(intent);
 }
 /**
 * 獲取版本名
 */
 public static String getVerName(Context context) {
 String verName = "";
 try {
 // 獲取packagemanager的實例
 PackageManager packageManager = context.getPackageManager();
 // getPackageName()是你當前類的包名,0代表是獲取版本信息
 PackageInfo packInfo = packageManager.getPackageInfo(
 context.getPackageName(), 0);

 verName = packInfo.versionName;
 } catch (Exception e) {
 e.printStackTrace();
 }
 return verName;
 }
 /**
 * 獲取版本號
 */
 public static int getVerCode(Context context) {
 int verCode = -1;
 try {
 // 獲取packagemanager的實例
 PackageManager packageManager = context.getPackageManager();
 // getPackageName()是你當前類的包名,0代表是獲取版本信息
 PackageInfo packInfo = packageManager.getPackageInfo(
 context.getPackageName(), 0);

 verCode = packInfo.versionCode;
 } catch (Exception e) {
 e.printStackTrace();
 }
 return verCode;
 }
}

關于如何在Android開發中中實現一個App更新功能問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

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

AI

东宁县| 泸溪县| 玉门市| 邵武市| 星子县| 湘西| 阳春市| 绥棱县| 博乐市| 宜丰县| 安岳县| 华安县| 大方县| 萨嘎县| 油尖旺区| 澄城县| 江北区| 昌宁县| 明溪县| 荥经县| 青铜峡市| 临澧县| 丹江口市| 大新县| 绍兴市| 将乐县| 巴林左旗| 万年县| 康平县| 西贡区| 华阴市| 商水县| 平遥县| 惠州市| 甘南县| 普宁市| 泾源县| 石楼县| 寻乌县| 邢台县| 启东市|