日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android:应用宝省流量更新

發(fā)布時間:2023/12/20 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android:应用宝省流量更新 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

應(yīng)用寶省流量更新介紹

應(yīng)用寶省流量更新(SDK),是應(yīng)用寶提供給開發(fā)者輕松實現(xiàn)應(yīng)用省流量更新的功能,可以幫助開發(fā)者縮短更新過程,提高應(yīng)用下載量。在每次應(yīng)用升級更新時,只需更新部分?jǐn)?shù)據(jù)而無需下載完整大小的安裝包,幫用戶節(jié)省了流量,也大大提高了產(chǎn)品升級速度。


注冊開發(fā)者

  • 進(jìn)入騰訊開放平臺

  • 點擊移動應(yīng)用,進(jìn)入登錄界面

  • 使用QQ號碼登錄或注冊新賬號,登錄后進(jìn)入注冊開發(fā)者界面,可選擇注冊為個人或公司開發(fā)者


創(chuàng)建應(yīng)用

  • 注冊成功后,進(jìn)入管理中心,點擊創(chuàng)建應(yīng)用

  • 填寫應(yīng)用信息,提交審核


實現(xiàn)省流量更新

  • 郵件申請渠道號

  • 添加引用TMAssistantSDK_selfUpdate_201407240950

  • 修改AndroidManifest.xml

    • 添加服務(wù)
    <service android:name="com.tencent.tmassistantsdk.downloadservice.TMAssistantDownloadSDKService"android:exported="false"android:process=":TMAssistantDownloadSDKService" ></service>
    • 添加權(quán)限
    <!-- 網(wǎng)絡(luò)請求 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 判斷當(dāng)前網(wǎng)絡(luò)類型 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 寫外部存儲卡 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  • 添加檢查更新代碼

    • SoftwareUpgrade.java

      軟件升級管理對象

    import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Handler; import android.os.Looper; import android.view.View;import com.tencent.tmassistantsdk.common.TMAssistantDownloadSDKTaskState; import com.tencent.tmassistantsdk.selfUpdateSDK.ITMSelfUpdateSDKListener; import com.tencent.tmassistantsdk.selfUpdateSDK.TMSelfUpdateSDK; import com.tencent.tmassistantsdk.selfUpdateSDK.TMSelfUpdateSDKUpdateInfo;import java.text.DecimalFormat;/*** 軟件升級,利用應(yīng)用寶的接口進(jìn)行軟件版本檢查、軟件升級*/ public class SoftwareUpgrade {private Context ctx = null;private static final String TAG = "SoftwareUpgrade";/*** AppID,應(yīng)用上線后獲得*/private static final long APP_ID = 0000000000;/*** 渠道ID,郵件申請省流量更新后獲得*/private static final String CHANNEL_ID = "0000000";/*** 省流量更新SDK*/private TMSelfUpdateSDK sdk = null;/*** 線程操作對象*/private Handler handler = null;/*** 是否需要提醒更新(自動檢查更新時需要)*/private boolean isNeedNotify = false;/*** 軟件更新的信息*/private SoftwareUpdateInfo updateInfo = null;public static SoftwareUpdateInfo getUpdateInfo() {if (instance != null) {return instance.updateInfo;}return null;}/*** 更新提示對話框*/private UpgradeDialog updateDialog = null;/*** 單例模式*/private static SoftwareUpgrade instance = null;public static SoftwareUpgrade getInstance() {if (instance == null) {instance = new SoftwareUpgrade();}if (instance.sdk == null) { // 初始化失敗,無法使用自動更新功能instance = null;}return instance;}/*** 初始化檢查更新(軟件啟動時調(diào)用)*/private SoftwareUpgrade() {// 得到主線程的Looper實例Looper looper = Looper.getMainLooper();handler = new Handler(looper);try {sdk = TMSelfUpdateSDK.getInstance();sdk.initTMSelfUpdateSDK(App.getInstance().getApplicationContext(), APP_ID, CHANNEL_ID, selfUpdateSDKListener);} catch (Exception ex) {sdk = null;LogUtil.d(TAG, "Init TMSelfUpdateSDK failed!");}}/*** 釋放(退出軟件時調(diào)用)*/public static void release() {if (instance != null && instance.sdk != null) {instance.sdk.destroySelfUpdateSDK(instance.selfUpdateSDKListener);instance = null;}}/*** 檢查軟件是否需要更新(靜默檢查,不彈出提示對話框)*/public static void checkNeedUpdate() {if (instance != null && instance.sdk != null) {instance.isNeedNotify = false;instance.sdk.checkNeedUpdate();}}/*** 檢查軟件是否需要更新(若有更新,則提醒用戶更新)*/public static void checkNeedUpdateNeedNotify(Context context) {if (instance != null && instance.sdk != null) {instance.ctx = context;instance.isNeedNotify = true;instance.sdk.checkNeedUpdate();}}/*** 開始省流量更新* 1、彈出更新信息對話框,詢問用戶是否更新* 2、若未安裝應(yīng)用寶,詢問用戶是否安裝* 3、跳轉(zhuǎn)到應(yīng)用寶更新軟件* @param ctx*/public static void startSaveUpdate(final Context ctx) {if (instance != null && instance.sdk != null) {instance.updateDialog = new UpgradeDialog(ctx);instance.updateDialog.setVersion(instance.updateInfo.newVersion);instance.updateDialog.setUpdateContent(instance.updateInfo.updateContent);instance.updateDialog.setUpdateSize(instance.updateInfo.updateSize);instance.updateDialog.setUpdateButtonOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {// 檢查應(yīng)用寶是否安裝int yybInstalled = instance.sdk.checkYYBInstalled();if (yybInstalled == TMAssistantDownloadSDKTaskState.UN_INSTALLED) {// 未安裝應(yīng)用寶,提示用戶需要安裝應(yīng)用寶DialogUtil.showWarnDialog(ctx,R.string.msg_no_yyb, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {instance.sdk.startSaveUpdate(ctx);}});} else {// 打開應(yīng)用寶更新instance.sdk.startSaveUpdate(ctx);instance.updateDialog.dismiss();}} catch (Exception e) {LogUtil.e(e);}}});}}/*** 省流量更新調(diào)用* 應(yīng)用寶已經(jīng)下載安裝完畢,回到調(diào)用方的頁面,調(diào)用方可以選擇是否調(diào)用該方法,call起應(yīng)用寶下載管理頁去更新*/public static void onResume() {if (instance != null && instance.sdk != null) {instance.sdk.onResume(App.getInstance().getApplicationContext());}}private ITMSelfUpdateSDKListener selfUpdateSDKListener = new ITMSelfUpdateSDKListener() {/*** 使用sdk自更新前,調(diào)用方法checkNeedUpdate檢查是否需要更新時回調(diào)* 如果有更新包,則返回新包大小、增量包大小* @param tmSelfUpdateSDKUpdateInfo 這個參數(shù),當(dāng)繼續(xù)往下走,下載 完成時,要傳回來給接口*/@Overridepublic void OnCheckNeedUpdateInfo(final TMSelfUpdateSDKUpdateInfo tmSelfUpdateSDKUpdateInfo) {updateInfo = new SoftwareUpdateInfo();if (tmSelfUpdateSDKUpdateInfo != null&& tmSelfUpdateSDKUpdateInfo.getStatus() == TMSelfUpdateSDKUpdateInfo.STATUS_OK&& tmSelfUpdateSDKUpdateInfo.getNewApkSize() > 0) {// 解析版本號String url = tmSelfUpdateSDKUpdateInfo.getUpdateDownloadUrl();String version = "";if (url != null && url.length() > 0) {String[] temp = url.split("_");if (temp.length > 2) {version = temp[1];}}updateInfo.hasNewVersion = true;updateInfo.newVersion = version;updateInfo.updateContent = tmSelfUpdateSDKUpdateInfo.getNewFeature();updateInfo.updateSize = getDataSize(tmSelfUpdateSDKUpdateInfo.getNewApkSize());}if (isNeedNotify) { // 如果需要更新,則跳轉(zhuǎn)到關(guān)于界面if (updateInfo.hasNewVersion) {DialogUtil.showWarnDialog(ctx,R.string.msg_has_new_version, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// 跳轉(zhuǎn)到關(guān)于界面進(jìn)行更新MainActivity mainActivity = (MainActivity) ctx;if (mainActivity != null) {mainActivity.startActivity(new Intent(mainActivity, AboutActivity.class));}}});} else {App.getInstance().toast(R.string.msg_current_lastest_version_software);}}}/*** 省流量更新時回調(diào)* 檢查應(yīng)用寶狀態(tài),若未安裝,則開始自動安裝* @param url 指定任務(wù)的url* @param state 下載狀態(tài)* @param errorCode 錯誤碼* @param errorMsg 錯誤描述*/@Overridepublic void OnDownloadYYBStateChanged(String url, final int state,int errorCode, String errorMsg) {handler.post(new Runnable() {@Overridepublic void run() {switch (state) {case TMAssistantDownloadSDKTaskState.DownloadSDKTaskState_WAITING:if (updateDialog != null) {updateDialog.startProgress();updateDialog.setProgressText(R.string.msg_waiting_install_yyb);}break;case TMAssistantDownloadSDKTaskState.DownloadSDKTaskState_DOWNLOADING:// 下方提供進(jìn)度更新顯示,此處不需要 // if (updateDialog != null) { // updateDialog.setProgressText("正在下載應(yīng)用寶"); // }break;case TMAssistantDownloadSDKTaskState.DownloadSDKTaskState_PAUSED: // if (updateDialog != null) { // updateDialog.setProgressText("應(yīng)用寶下載暫停"); // }break;case TMAssistantDownloadSDKTaskState.DownloadSDKTaskState_SUCCEED:if (updateDialog != null) {updateDialog.setProgressText(R.string.msg_download_yyb_success);updateDialog.dismiss();}break;case TMAssistantDownloadSDKTaskState.DownloadSDKTaskState_FAILED:if (updateDialog != null) {updateDialog.dismiss();App.getInstance().toast(R.string.msg_download_yyb_failed);}break;default: // App.getInstance().toast(state);break;}}});}/*** 省流量更新時回調(diào)* 下載應(yīng)用寶的進(jìn)度* @param url 指定任務(wù)的url* @param receiveDataLen 已經(jīng)接收的數(shù)據(jù)長度* @param totalDataLen 全部需要接收的數(shù)據(jù)長度(如果無法獲取目標(biāo)文件的總長度,此參數(shù)返回-1)*/@Overridepublic void OnDownloadYYBProgressChanged(final String url,final long receiveDataLen, final long totalDataLen) {handler.post(new Runnable() {@Overridepublic void run() {if (updateDialog != null) {updateDialog.setProgress((int) (receiveDataLen * 100 / (double) totalDataLen));updateDialog.setProgressText(getDataSize(receiveDataLen) + " / " + getDataSize(totalDataLen));}}});}};/*** 計算數(shù)據(jù)大小,將bit轉(zhuǎn)換為k或M的單位輸出* @param dataSize* @return*/private String getDataSize(long dataSize) {long kb = dataSize / 1024; // 單位kif (kb < 1024) {return kb + "k";}double mb = dataSize / 1024.0 / 1024.0 + 0.05; // 轉(zhuǎn)換為M,保留一位小數(shù),四舍五入return new DecimalFormat(".0").format(mb) + "M";}/*** 軟件更新信息*/public class SoftwareUpdateInfo {/*** 是否有新版本*/public boolean hasNewVersion = false;/*** 新版本號*/public String newVersion = "";/*** 更新內(nèi)容*/public String updateContent = "";/*** 更新大小*/public String updateSize = "";} }
    • UpgradeDialog.java

      軟件升級信息對話框

    import android.app.AlertDialog; import android.content.Context; import android.support.annotation.StringRes; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView;public class UpgradeDialog {private Context ctx = null;private AlertDialog dialog = null;private TextView tvVersion = null;private TextView tvUpdateContent = null;private LinearLayout layoutUpdateButton = null;private Button btnNotUpdate = null;private Button btnUpdate = null;private LinearLayout layoutUpdateProgress = null;private ProgressBar progressBar = null;private TextView tvUpdateProgress = null;public UpgradeDialog(Context context) {ctx = context;LayoutInflater layoutInflater = LayoutInflater.from(ctx);View view = layoutInflater.inflate(R.layout.dialog_notify_update, null);if (view != null) {tvVersion = (TextView) view.findViewById(R.id.tv_version);tvUpdateContent = (TextView) view.findViewById(R.id.tv_update_content);layoutUpdateButton = (LinearLayout) view.findViewById(R.id.layout_update_button);btnNotUpdate = (Button) view.findViewById(R.id.btn_not_update);btnUpdate = (Button) view.findViewById(R.id.btn_update);layoutUpdateProgress = (LinearLayout) view.findViewById(R.id.layout_update_progress);progressBar = (ProgressBar) view.findViewById(R.id.progressBar);tvUpdateProgress = (TextView) view.findViewById(R.id.tv_update_progress);AlertDialog.Builder builder = new AlertDialog.Builder(ctx);builder.setTitle(R.string.layout_update_software_notify);builder.setView(view);dialog = builder.create();dialog.setCancelable(false);dialog.show();btnNotUpdate.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {dialog.dismiss();}});progressBar.setMax(100);}}public void setVersion(String version) {if (tvVersion != null) {tvVersion.setText(version);}}public void setUpdateContent(String updateContent) {if (tvUpdateContent != null) {tvUpdateContent.setText(updateContent);}}public void setUpdateSize(String newApkSize) {if (btnUpdate != null) {btnUpdate.setText(ctx.getString(R.string.layout_update_software_update_now, newApkSize));}}public void setUpdateButtonOnClickListener(View.OnClickListener listener) {if (btnUpdate != null) {btnUpdate.setOnClickListener(listener);}}public void dismiss() {if (dialog != null && dialog.isShowing()) {dialog.dismiss();}}public void setProgress(int value) {if (progressBar != null) {progressBar.setProgress(value);}}public void setProgressText(@StringRes int progress) {if (tvUpdateProgress != null) {tvUpdateProgress.setText(progress);}}public void setProgressText(String progress) {if (tvUpdateProgress != null) {tvUpdateProgress.setText(progress);}}public void startProgress() {if (layoutUpdateProgress != null) {layoutUpdateProgress.setVisibility(View.VISIBLE);}if (progressBar != null) {progressBar.setProgress(0);}if (layoutUpdateButton != null) {layoutUpdateButton.setVisibility(View.GONE);}} }
    • dialog_notify_update.xml

      軟件升級提示界面

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="@dimen/app_content_border_size"android:layout_gravity="center"><LinearLayout android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:gravity="center_horizontal"><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/layout_update_software_update_content"android:textColor="@color/app_title_textColor"android:textSize="@dimen/app_content_textSize"android:textStyle="bold"/><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="@dimen/app_space_size"android:textColor="@color/app_title_textColor"android:textSize="@dimen/app_content_textSize"android:textStyle="bold"android:id="@+id/tv_version"/></LinearLayout><ScrollView android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:layout_marginTop="@dimen/app_content_border_size"android:minWidth="@dimen/software_upgrade_scrollbar_min_width"android:minHeight="@dimen/software_upgrade_scrollbar_min_height"android:scrollbars="vertical"><TextView android:layout_width="match_parent"android:layout_height="match_parent"android:textColor="@color/app_title_textColor"android:id="@+id/tv_update_content"/></ScrollView><LinearLayout android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:layout_marginTop="@dimen/app_content_border_size"android:visibility="gone"android:id="@+id/layout_update_progress"><ProgressBar style="?android:attr/progressBarStyleHorizontal"android:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/progressBar" /><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginTop="@dimen/app_space_size"android:textColor="@color/app_title_textColor"android:id="@+id/tv_update_progress"/></LinearLayout><LinearLayout android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_marginTop="@dimen/app_content_border_size"android:id="@+id/layout_update_button"><Button android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="@string/layout_update_software_not_update"android:id="@+id/btn_not_update"/><Button android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="@string/layout_update_software_update_now"android:id="@+id/btn_update"/></LinearLayout></LinearLayout>
    • MainActivity.xml

      主界面中初始化和釋放軟件升級管理對象

    public class MainActivity extends FragmentActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mainView = LayoutInflater.from(this).inflate(R.layout.activity_main, null);setContentView(mainView);// 初始化軟件更新對象SoftwareUpgrade softwareUpgrade = SoftwareUpgrade.getInstance();if (softwareUpgrade == null) {app.setCanAutoUpdate(false); // 公共變量,用于標(biāo)識自動更新對象是否初始化成功,若不成功,則屏蔽相關(guān)功能app.toast(R.string.msg_init_auto_update_software_failed);} else {app.setCanAutoUpdate(true);// 檢查軟件更新if (app.isAutoCheckSoftwareUpdate()) { // 是否開啟自動檢查更新功能SoftwareUpgrade.checkNeedUpdateNeedNotify(this); // 彈框提醒更新} else {SoftwareUpgrade.checkNeedUpdate(); // 不彈框提醒}}}@Overrideprotected void onDestroy() {// 釋放軟件更新對象SoftwareUpgrade.release();super.onDestroy();} }
    • SoftwareSetupFragment.java

      軟件設(shè)置界面,包含“自動檢查更新”開關(guān)配置,關(guān)于。

    public class SoftwareSetupFragment extends BaseFragment {@Bind(R.id.btn_auto_check_software_update)ButtonSettingLayout btnAutoCheckSoftwareUpdate;@Bind(R.id.btn_about)ButtonSettingLayout btnAbout;@Overrideprotected int getContentLayoutId() {return R.layout.fragment_software_setup;}/*** 自動檢查更新的配置key*/public static final String PREF_AUTO_CHECK_SOFTWARE_UPDATE = "auto_check_software_update";@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View rootView = super.onCreateView(inflater, container, savedInstanceState);initialize(rootView);return rootView;}@Overrideprotected void initialize(View rootView) {ButterKnife.bind(this, rootView);// 自動檢查軟件更新btnAutoCheckSoftwareUpdate.setVisibility(app.isCanAutoUpdate() ? View.VISIBLE : View.GONE);btnAutoCheckSoftwareUpdate.setChecked(app.isAutoCheckSoftwareUpdate());btnAutoCheckSoftwareUpdate.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {prefs.edit().putBoolean(PREF_AUTO_CHECK_SOFTWARE_UPDATE, isChecked).commit();app.setAutoCheckSoftwareUpdate(isChecked);}});// 關(guān)于if (SoftwareUpgrade.getUpdateInfo() != null && SoftwareUpgrade.getUpdateInfo().hasNewVersion) {btnAbout.setIconColor(Color.RED);}btnAbout.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {parent.startActivityFromFragment(SoftwareSetupFragment.this,new Intent(getActivity(), AboutActivity.class), 0);}});}@Overrideprotected void release() {ButterKnife.unbind(this);} }
    • AboutActivity.java

      關(guān)于界面,提供軟件升級功能

    public class AboutActivity extends BaseActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);btnCheckUpdate.setVisibility(app.isCanAutoUpdate() ? View.VISIBLE : View.GONE);if (SoftwareUpgrade.getUpdateInfo() != null) {if (SoftwareUpgrade.getUpdateInfo().hasNewVersion) {btnCheckUpdate.setText(getString(R.string.layout_update_software_update_now, SoftwareUpgrade.getUpdateInfo().newVersion));btnCheckUpdate.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {SoftwareUpgrade.startSaveUpdate(AboutActivity.this);}});} else {btnCheckUpdate.setText(R.string.msg_current_lastest_version_software);}}}@Overrideprotected void onResume() {super.onResume();SoftwareUpgrade.onResume();} }
    • strings.xml
    <string name="msg_init_auto_update_software_failed">初始化自動更新功能失敗!</string> <string name="msg_current_lastest_version_software">當(dāng)前為最新版本</string> <string name="layout_update_software_update_now">更新(%1$s)</string> <string name="layout_update_software_notify">軟件升級提醒</string> <string name="layout_update_software_update_content">新版特性</string> <string name="layout_update_software_not_update">暫不更新</string> <string name="msg_no_yyb">未安裝應(yīng)用寶,將開始安裝應(yīng)用寶!</string> <string name="msg_has_new_version">軟件有新版本,是否更新?</string> <string name="msg_waiting_install_yyb">等待安裝應(yīng)用寶</string> <string name="msg_download_yyb_success">應(yīng)用寶下載成功,開始安裝應(yīng)用寶</string> <string name="msg_download_yyb_failed">下載應(yīng)用寶失敗,請檢查網(wǎng)絡(luò)連接</string>

接入省流量更新(獲取官方介紹)

  • 進(jìn)入應(yīng)用

  • 點擊基礎(chǔ)服務(wù)中的更多,可進(jìn)入省流量更新

  • 省流量更新頁面中,點擊查看詳情,進(jìn)入省流量更新詳情頁


總結(jié)

以上是生活随笔為你收集整理的Android:应用宝省流量更新的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。