{"id":1869,"date":"2023-03-29T22:39:34","date_gmt":"2023-03-29T14:39:34","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=1869"},"modified":"2023-04-22T09:05:27","modified_gmt":"2023-04-22T01:05:27","slug":"android-integrated-bugly-application-upgrade-advanced-configuration","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/03\/29\/android-integrated-bugly-application-upgrade-advanced-configuration\/","title":{"rendered":"Android\u96c6\u6210Bugly\u5e94\u7528\u5347\u7ea7\u9ad8\u7ea7\u914d\u7f6e"},"content":{"rendered":"<h2>Beta\u7c7b<\/h2>\n<p>\u63d0\u4f9b<code>Beta<\/code>\u7c7b\u4f5c\u4e3aBugly\u7684\u521d\u59cb\u5316\u6269\u5c55\uff0c\u901a\u8fc7<code>Beta<\/code>\u7c7b\u53ef\u4ee5\u4fee\u6539\u5347\u7ea7\u7684\u68c0\u6d4b\u65f6\u673a\uff0c\u754c\u9762\u5143\u7d20\u4ee5\u53ca\u81ea\u5b9a\u4e49\u5347\u7ea7\u884c\u4e3a\uff0c\u53ef\u4ee5\u53c2\u8003 <a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/github.com\/vell001\/BetaSDKDemo\" title=\"BetaSDKDemo\">BetaSDKDemo<\/a> \u7684\u76f8\u5173\u8bbe\u7f6e\u3002<\/p>\n<p><!-- more --><\/p>\n<h3>\u81ea\u52a8\u521d\u59cb\u5316\u5f00\u5173<\/h3>\n<pre><code class=\"language-java\">Beta.autoInit = true;<\/code><\/pre>\n<p><code>true<\/code>\u8868\u793aapp\u542f\u52a8\u81ea\u52a8\u521d\u59cb\u5316\u5347\u7ea7\u6a21\u5757\uff0c<code>false<\/code>\u4e0d\u4f1a\u81ea\u52a8\u521d\u59cb\u5316\u3002\u5f00\u53d1\u8005\u5982\u679c\u62c5\u5fc3sdk\u521d\u59cb\u5316\u5f71\u54cdapp\u542f\u52a8\u901f\u5ea6\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u4e3a<code>false<\/code>\uff0c\u5728\u540e\u9762\u67d0\u4e2a\u65f6\u523b\u624b\u52a8\u8c03\u7528<code>Beta.init(getApplicationContext(), false)<\/code><\/p>\n<h3>\u81ea\u52a8\u68c0\u67e5\u66f4\u65b0\u5f00\u5173<\/h3>\n<pre><code class=\"language-java\">Beta.autoCheckUpgrade = true;<\/code><\/pre>\n<p><code>true<\/code>\u8868\u793a\u521d\u59cb\u5316\u65f6\u81ea\u52a8\u68c0\u67e5\u5347\u7ea7\uff0c<code>false<\/code>\u8868\u793a\u4e0d\u4f1a\u81ea\u52a8\u68c0\u67e5\u5347\u7ea7\uff0c\u9700\u8981\u624b\u52a8\u8c03\u7528<code>Beta.checkUpgrade()<\/code>\u65b9\u6cd5<\/p>\n<h3>\u5347\u7ea7\u68c0\u67e5\u5468\u671f\u8bbe\u7f6e<\/h3>\n<pre><code class=\"language-java\">Beta.upgradeCheckPeriod = 60 * 1000;<\/code><\/pre>\n<p>\u8bbe\u7f6e\u5347\u7ea7\u68c0\u67e5\u5468\u671f\u4e3a60s\uff08\u9ed8\u8ba4\u68c0\u67e5\u5468\u671f\u4e3a0s\uff09\uff0c60s\u5185SDK\u4e0d\u91cd\u590d\u5411\u540e\u53f0\u8bf7\u6c42\u7b56\u7565<\/p>\n<h3>\u5ef6\u8fdf\u521d\u59cb\u5316<\/h3>\n<pre><code class=\"language-java\">Beta.initDelay = 1 * 1000;<\/code><\/pre>\n<p>\u8bbe\u7f6e\u542f\u52a8\u5ef6\u65f6\u4e3a1s\uff08\u9ed8\u8ba4\u5ef6\u65f63s\uff09\uff0cAPP\u542f\u52a81s\u540e\u521d\u59cb\u5316SDK\uff0c\u907f\u514d\u5f71\u54cdAPP\u542f\u52a8\u901f\u5ea6;<\/p>\n<h3>\u8bbe\u7f6e\u901a\u77e5\u680f\u5927\u56fe\u6807<\/h3>\n<pre><code class=\"language-java\">Beta.largeIconId = R.drawable.ic_launcher;<\/code><\/pre>\n<p><code>largeIconId<\/code>\u4e3a\u9879\u76ee\u4e2d\u7684\u56fe\u7247\u8d44\u6e90id<\/p>\n<h3>\u8bbe\u7f6e\u72b6\u6001\u680f\u5c0f\u56fe\u6807<\/h3>\n<pre><code class=\"language-java\">Beta.smallIconId = R.drawable.ic_launcher;<\/code><\/pre>\n<p><code>smallIconId<\/code>\u4e3a\u9879\u76ee\u4e2d\u7684\u56fe\u7247\u8d44\u6e90id<\/p>\n<h3>\u8bbe\u7f6e\u66f4\u65b0\u5f39\u7a97\u9ed8\u8ba4\u5c55\u793a\u7684banner<\/h3>\n<pre><code class=\"language-java\">Beta.defaultBannerId = R.drawable.ic_launcher;<\/code><\/pre>\n<p><code>defaultBannerId<\/code>\u4e3a\u9879\u76ee\u4e2d\u7684\u56fe\u7247\u8d44\u6e90Id\uff0c\u5f53\u540e\u53f0\u914d\u7f6e\u7684banner\u62c9\u53d6\u5931\u8d25\u65f6\u663e\u793a\u6b64banner\uff0c\u9ed8\u8ba4\u4e0d\u8bbe\u7f6e\u5219\u5c55\u793a<code>loading...<\/code><\/p>\n<h3>\u8bbe\u7f6eSD\u5361\u7684Download\u4e3a\u66f4\u65b0\u8d44\u6e90\u5b58\u50a8\u76ee\u5f55<\/h3>\n<pre><code class=\"language-java\">Beta.storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);<\/code><\/pre>\n<p>\u540e\u7eed\u66f4\u65b0\u8d44\u6e90\u4f1a\u4fdd\u5b58\u5728\u6b64\u76ee\u5f55\uff0c\u9700\u8981\u5728manifest\u4e2d\u6dfb\u52a0<code>WRITE_EXTERNAL_STORAGE<\/code>\u6743\u9650<\/p>\n<h3>\u8bbe\u7f6e\u5f00\u542f\u663e\u793a\u6253\u65ad\u7b56\u7565<\/h3>\n<pre><code class=\"language-java\">Beta.showInterruptedStrategy = true;<\/code><\/pre>\n<p>\u8bbe\u7f6e\u70b9\u51fb\u8fc7\u786e\u8ba4\u7684\u5f39\u7a97\u5728App\u4e0b\u6b21\u542f\u52a8\u81ea\u52a8\u68c0\u67e5\u66f4\u65b0\u65f6\u4f1a\u518d\u6b21\u663e\u793a<\/p>\n<h3>\u6dfb\u52a0\u53ef\u663e\u793a\u5f39\u7a97\u7684Activity<\/h3>\n<pre><code class=\"language-java\">Beta.canShowUpgradeActs.add(MainActivity.class);<\/code><\/pre>\n<p>\u4f8b\u5982\uff0c\u53ea\u5141\u8bb8\u5728<code>MainActivity<\/code>\u4e0a\u663e\u793a\u66f4\u65b0\u5f39\u7a97\uff0c\u5176\u4ed6<code>Activity<\/code>\u4e0a\u4e0d\u663e\u793a\u5f39\u7a97\uff0c\u5982\u679c\u4e0d\u8bbe\u7f6e\u9ed8\u8ba4\u6240\u6709<code>Activity<\/code>\u90fd\u53ef\u4ee5\u663e\u793a\u5f39\u7a97<\/p>\n<h3>\u8bbe\u7f6e\u81ea\u5b9a\u4e49\u5347\u7ea7\u5bf9\u8bdd\u6846UI\u5e03\u5c40<\/h3>\n<pre><code class=\"language-java\">Beta.upgradeDialogLayoutId = R.layout.upgrade_dialog;<\/code><\/pre>\n<p><code>upgrade_dialog<\/code>\u4e3a\u9879\u76ee\u7684\u5e03\u5c40\u8d44\u6e90\u3002\u6ce8\u610f\uff1a\u56e0\u4e3a\u8981\u4fdd\u6301\u63a5\u53e3\u7edf\u4e00\uff0c\u9700\u8981\u7528\u6237\u5728\u6307\u5b9a\u63a7\u4ef6\u6309\u7167\u4ee5\u4e0b\u65b9\u5f0f\u8bbe\u7f6etag\uff0c\u5426\u5219\u4f1a\u5f71\u54cd\u6b63\u5e38\u4f7f\u7528\uff1a<\/p>\n<ul>\n<li>\u7279\u6027\u56fe\u7247\uff1a<code>beta_upgrade_banner<\/code>\uff0c\u5982\uff1a<code>android:tag=&quot;beta_upgrade_banner&quot;<\/code><\/li>\n<li>\u6807\u9898\uff1a<code>beta_title<\/code>\uff0c\u5982\uff1a<code>android:tag=&quot;beta_title&quot;<\/code><\/li>\n<li>\u5347\u7ea7\u4fe1\u606f\uff1a<code>beta_upgrade_info<\/code>\uff0c\u5982\uff1a<code>android:tag=&quot;beta_upgrade_info&quot;<\/code><\/li>\n<li>\u66f4\u65b0\u5c5e\u6027\uff1a<code>beta_upgrade_feature<\/code>\uff0c\u5982\uff1a<code>android:tag=&quot;beta_upgrade_feature&quot;<\/code><\/li>\n<li>\u53d6\u6d88\u6309\u94ae\uff1a<code>beta_cancel_button<\/code>\uff0c\u5982\uff1a<code>android:tag=&quot;beta_cancel_button&quot;<\/code><\/li>\n<li>\u786e\u5b9a\u6309\u94ae\uff1a<code>beta_confirm_button<\/code>\uff0c\u5982\uff1a<code>android:tag=&quot;beta_confirm_button&quot;<\/code><\/li>\n<\/ul>\n<h3>\u8bbe\u7f6e\u81ea\u5b9a\u4e49tip\u5f39\u7a97UI\u5e03\u5c40<\/h3>\n<pre><code class=\"language-java\">Beta.tipsDialogLayoutId = R.layout.tips_dialog;<\/code><\/pre>\n<p>\u6ce8\u610f\uff1a\u56e0\u4e3a\u8981\u4fdd\u6301\u63a5\u53e3\u7edf\u4e00\uff0c\u9700\u8981\u7528\u6237\u5728\u6307\u5b9a\u63a7\u4ef6\u6309\u7167\u4ee5\u4e0b\u65b9\u5f0f\u8bbe\u7f6etag\uff0c\u5426\u5219\u4f1a\u5f71\u54cd\u6b63\u5e38\u4f7f\u7528\uff1a<\/p>\n<ul>\n<li>\u6807\u9898\uff1a<code>beta_title<\/code>\uff0c\u5982\uff1a<code>android:tag=&quot;beta_title&quot;<\/code><\/li>\n<li>\u63d0\u793a\u4fe1\u606f\uff1a<code>beta_tip_message<\/code>\uff0c\u5982\uff1a<code>android:tag=&quot;beta_tip_message&quot;<\/code><\/li>\n<li>\u53d6\u6d88\u6309\u94ae\uff1a<code>beta_cancel_button<\/code>\uff0c\u5982\uff1a<code>android:tag=&quot;beta_cancel_button&quot;<\/code><\/li>\n<li>\u786e\u5b9a\u6309\u94ae\uff1a<code>beta_confirm_button<\/code>\uff0c\u5982\uff1a<code>android:tag=&quot;beta_confirm_button&quot;<\/code><\/li>\n<\/ul>\n<h3>\u8bbe\u7f6e\u5347\u7ea7\u5bf9\u8bdd\u6846\u751f\u547d\u5468\u671f\u56de\u8c03\u63a5\u53e3<\/h3>\n<pre><code class=\"language-java\">Beta.upgradeDialogLifecycleListener = new UILifecycleListener&lt;UpgradeInfo&gt;() {\n    @Override\n    public void onCreate(Context context, View view, UpgradeInfo upgradeInfo) {\n        Log.d(TAG, &quot;onCreate&quot;);\n\n    }\n\n    @Override\n    public void onStart(Context context, View view, UpgradeInfo upgradeInfo) {\n        Log.d(TAG, &quot;onStart&quot;);\n    }\n\n    @Override\n    public void onResume(Context context, View view, UpgradeInfo upgradeInfo) {\n        Log.d(TAG, &quot;onResume&quot;);\n        \/\/ \u6ce8\uff1a\u53ef\u901a\u8fc7\u8fd9\u4e2a\u56de\u8c03\u65b9\u5f0f\u83b7\u53d6\u5e03\u5c40\u7684\u63a7\u4ef6\uff0c\u5982\u679c\u8bbe\u7f6e\u4e86id\uff0c\u53ef\u901a\u8fc7findViewById\u65b9\u5f0f\u83b7\u53d6\uff0c\u5982\u679c\u8bbe\u7f6e\u4e86tag\uff0c\u53ef\u4ee5\u901a\u8fc7findViewWithTag\uff0c\u5177\u4f53\u53c2\u8003\u4e0b\u9762\u4f8b\u5b50:\n\n        \/\/ \u901a\u8fc7id\u65b9\u5f0f\u83b7\u53d6\u63a7\u4ef6\uff0c\u5e76\u66f4\u6539imageview\u56fe\u7247\n        ImageView imageView = (ImageView) view.findViewById(R.id.icon);\n        imageView.setImageResource(R.mipmap.ic_launcher);\n\n        \/\/ \u901a\u8fc7tag\u65b9\u5f0f\u83b7\u53d6\u63a7\u4ef6\uff0c\u5e76\u66f4\u6539\u5e03\u5c40\u5185\u5bb9\n        TextView textView = (TextView) view.findViewWithTag(&quot;textview&quot;);\n        textView.setText(&quot;my custom text&quot;);\n\n        \/\/ \u66f4\u591a\u7684\u64cd\u4f5c\uff1a\u6bd4\u5982\u8bbe\u7f6e\u63a7\u4ef6\u7684\u70b9\u51fb\u4e8b\u4ef6\n        imageView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Intent intent = new Intent(getApplicationContext(), OtherActivity.class);\n                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n                startActivity(intent);\n            }\n        });\n    }\n\n    @Override\n    public void onPause(Context context, View view, UpgradeInfo upgradeInfo) {\n        Log.d(TAG, &quot;onPause&quot;);\n    }\n\n    @Override\n    public void onStop(Context context, View view, UpgradeInfo upgradeInfo) {\n        Log.d(TAG, &quot;onStop&quot;);\n    }\n\n    @Override\n    public void onDestroy(Context context, View view, UpgradeInfo upgradeInfo) {\n        Log.d(TAG, &quot;onDestory&quot;);\n    }\n\n};<\/code><\/pre>\n<blockquote>\n<p>\u5982\u679c\u60f3\u76d1\u542c\u5347\u7ea7\u5bf9\u8bdd\u6846\u7684\u751f\u547d\u5468\u671f\u4e8b\u4ef6\uff0c\u53ef\u4ee5\u901a\u8fc7\u8bbe\u7f6e<code>OnUILifecycleListener<\/code>\u63a5\u53e3\uff0c\u56de\u8c03\u53c2\u6570\u89e3\u91ca\uff1a<\/p>\n<\/blockquote>\n<ul>\n<li><code>context<\/code> &#8211; \u5f53\u524d\u5f39\u7a97\u4e0a\u4e0b\u6587\u5bf9\u8c61<\/li>\n<li><code>view<\/code> &#8211; \u5347\u7ea7\u5bf9\u8bdd\u6846\u7684\u6839\u5e03\u5c40\u89c6\u56fe\uff0c\u53ef\u901a\u8fc7\u8fd9\u4e2a\u5bf9\u8c61\u67e5\u627e\u6307\u5b9aview\u63a7\u4ef6<\/li>\n<li><code>upgradeInfo<\/code> &#8211; \u5347\u7ea7\u4fe1\u606f<\/li>\n<\/ul>\n<h3>\u8bbe\u7f6e\u662f\u5426\u663e\u793a\u6d88\u606f\u901a\u77e5<\/h3>\n<pre><code class=\"language-java\">Beta.enableNotification = true;<\/code><\/pre>\n<p>\u5982\u679c\u4e0d\u60f3\u5728\u901a\u77e5\u680f\u663e\u793a\u4e0b\u8f7d\u8fdb\u5ea6\uff0c\u53ef\u4ee5\u5c06\u8fd9\u4e2a\u63a5\u53e3\u8bbe\u7f6e\u4e3a<code>false<\/code>\uff0c\u9ed8\u8ba4\u503c\u4e3a<code>true<\/code><\/p>\n<h3>\u8bbe\u7f6eWifi\u4e0b\u81ea\u52a8\u4e0b\u8f7d<\/h3>\n<pre><code>Beta.autoDownloadOnWifi = false;<\/code><\/pre>\n<p>\u5982\u679c\u60f3\u5728Wifi\u7f51\u7edc\u4e0b\u81ea\u52a8\u4e0b\u8f7d\uff0c\u53ef\u4ee5\u5c06\u8fd9\u4e2a\u63a5\u53e3\u8bbe\u7f6e\u4e3a<code>true<\/code>\uff0c\u9ed8\u8ba4\u503c\u4e3a<code>false<\/code><\/p>\n<h3>\u8bbe\u7f6e\u662f\u5426\u663e\u793a\u5f39\u7a97\u4e2d\u7684apk\u4fe1\u606f<\/h3>\n<pre><code>Beta.canShowApkInfo = true;<\/code><\/pre>\n<p>\u5982\u679c\u4f7f\u7528\u9ed8\u8ba4\u5f39\u7a97\u662f\u4f1a\u663e\u793aapk\u4fe1\u606f\u7684\uff0c\u5982\u679c\u4e0d\u60f3\u663e\u793a\u53ef\u4ee5\u5c06\u8fd9\u4e2a\u63a5\u53e3\u8bbe\u7f6e\u4e3a<code>false<\/code><\/p>\n<h3>\u5173\u95ed\u70ed\u66f4\u65b0\u80fd\u529b<\/h3>\n<pre><code>Beta.enableHotfix = true;<\/code><\/pre>\n<p>\u5347\u7ea7SDK\u9ed8\u8ba4\u662f\u5f00\u542f\u70ed\u66f4\u65b0\u80fd\u529b\u7684\uff0c\u5982\u679c\u4e0d\u9700\u8981\u4f7f\u7528\u70ed\u66f4\u65b0\uff0c\u53ef\u4ee5\u5c06\u8fd9\u4e2a\u63a5\u53e3\u8bbe\u7f6e\u4e3a<code>false<\/code><\/p>\n<h3>\u521d\u59cb\u5316\u7edf\u4e00\u63a5\u53e3<\/h3>\n<pre><code class=\"language-java\">Bugly.init(this, APP_ID, false);<\/code><\/pre>\n<h2>\u63a5\u53e3\u8bf4\u660e<\/h2>\n<h3>\u66f4\u65b0\u529f\u80fd\u4e3b\u8981API<\/h3>\n<pre><code class=\"language-java\">\/**\n * \u624b\u52a8\u68c0\u67e5\u66f4\u65b0\uff08\u7528\u4e8e\u8bbe\u7f6e\u9875\u9762\u4e2d\u68c0\u6d4b\u66f4\u65b0\u6309\u94ae\u7684\u70b9\u51fb\u4e8b\u4ef6\uff09\n *\/\npublic static synchronized void checkUpgrade()\n\n\/**\n * \u83b7\u53d6\u672c\u5730\u5df2\u6709\u5347\u7ea7\u7b56\u7565\uff08\u975e\u5b9e\u65f6\uff0c\u53ef\u7528\u4e8e\u754c\u9762\u7ea2\u70b9\u5c55\u793a\uff09\n *\n * @return\n *\/\npublic static synchronized UpgradeInfo getUpgradeInfo()\n\n\/**\n * @param isManual  \u7528\u6237\u624b\u52a8\u70b9\u51fb\u68c0\u67e5\uff0c\u975e\u7528\u6237\u70b9\u51fb\u64cd\u4f5c\u8bf7\u4f20false\n * @param isSilence \u662f\u5426\u663e\u793a\u5f39\u7a97\u7b49\u4ea4\u4e92\uff0c[true:\u6ca1\u6709\u5f39\u7a97\u548ctoast] [false:\u6709\u5f39\u7a97\u6216toast]\n *\/\npublic static synchronized void checkUpgrade(boolean isManual, boolean isSilence)<\/code><\/pre>\n<h3>\u4f7f\u7528\u793a\u4f8b<\/h3>\n<pre><code class=\"language-java\">public class MainActivity extends Activity {\n    Button checkUpgradeBtn;\n    Button refreshBtn;\n    TextView upgradeInfoTv;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n        checkUpgradeBtn = $(R.id.check_upgrade);\n        refreshBtn = $(R.id.refresh_info);\n        upgradeInfoTv = $(R.id.upgrade_info);\n\n        checkUpgradeBtn.setOnClickListener(new OnClickListener() {\n        @Override\n            public void onClick(View v) {\n\n                \/***** \u68c0\u67e5\u66f4\u65b0 *****\/\n                Beta.checkUpgrade();\n            }\n        });\n\n        refreshBtn.setOnClickListener(new OnClickListener() {\n\n            @Override\n            public void onClick(View v) {\n                loadUpgradeInfo();\n            }\n        });\n    }\n\n    private void loadUpgradeInfo() {\n        if (upgradeInfoTv == null)\n            return;\n\n        \/***** \u83b7\u53d6\u5347\u7ea7\u4fe1\u606f *****\/\n        UpgradeInfo upgradeInfo = Beta.getUpgradeInfo();\n\n        if (upgradeInfo == null) {\n            upgradeInfoTv.setText(&quot;\u65e0\u5347\u7ea7\u4fe1\u606f&quot;);\n            return;\n        }\n        StringBuilder info = new StringBuilder();\n        info.append(&quot;id: &quot;).append(upgradeInfo.id).append(&quot;\\n&quot;);\n        info.append(&quot;\u6807\u9898: &quot;).append(upgradeInfo.title).append(&quot;\\n&quot;);\n        info.append(&quot;\u5347\u7ea7\u8bf4\u660e: &quot;).append(upgradeInfo.newFeature).append(&quot;\\n&quot;);\n        info.append(&quot;versionCode: &quot;).append(upgradeInfo.versionCode).append(&quot;\\n&quot;);\n        info.append(&quot;versionName: &quot;).append(upgradeInfo.versionName).append(&quot;\\n&quot;);\n        info.append(&quot;\u53d1\u5e03\u65f6\u95f4: &quot;).append(upgradeInfo.publishTime).append(&quot;\\n&quot;);\n        info.append(&quot;\u5b89\u88c5\u5305Md5: &quot;).append(upgradeInfo.apkMd5).append(&quot;\\n&quot;);\n        info.append(&quot;\u5b89\u88c5\u5305\u4e0b\u8f7d\u5730\u5740: &quot;).append(upgradeInfo.apkUrl).append(&quot;\\n&quot;);\n        info.append(&quot;\u5b89\u88c5\u5305\u5927\u5c0f: &quot;).append(upgradeInfo.fileSize).append(&quot;\\n&quot;);\n        info.append(&quot;\u5f39\u7a97\u95f4\u9694\uff08ms\uff09: &quot;).append(upgradeInfo.popInterval).append(&quot;\\n&quot;);\n        info.append(&quot;\u5f39\u7a97\u6b21\u6570: &quot;).append(upgradeInfo.popTimes).append(&quot;\\n&quot;);\n        info.append(&quot;\u53d1\u5e03\u7c7b\u578b\uff080:\u6d4b\u8bd5 1:\u6b63\u5f0f\uff09: &quot;).append(upgradeInfo.publishType).append(&quot;\\n&quot;);\n        info.append(&quot;\u5f39\u7a97\u7c7b\u578b\uff081:\u5efa\u8bae 2:\u5f3a\u5236 3:\u624b\u5de5\uff09: &quot;).append(upgradeInfo.upgradeType).append(&quot;\\n&quot;);\n        info.append(&quot;\u56fe\u7247\u5730\u5740\uff1a&quot;).append(upgradeInfo.imageUrl);\n\n        upgradeInfoTv.setText(info);\n    }\n}<\/code><\/pre>\n<p><code>UpgradeInfo<\/code>\u5185\u5bb9\u5982\u4e0b<\/p>\n<pre><code class=\"language-java\">public String id = &quot;&quot;;\/\/\u552f\u4e00\u6807\u8bc6\npublic String title = &quot;&quot;;\/\/\u5347\u7ea7\u63d0\u793a\u6807\u9898\npublic String newFeature = &quot;&quot;;\/\/\u5347\u7ea7\u7279\u6027\u63cf\u8ff0\npublic long publishTime = 0;\/\/\u5347\u7ea7\u53d1\u5e03\u65f6\u95f4,ms\npublic int publishType = 0;\/\/\u5347\u7ea7\u7c7b\u578b 0\u6d4b\u8bd5 1\u6b63\u5f0f\npublic int upgradeType = 1;\/\/\u5347\u7ea7\u7b56\u7565 1\u5efa\u8bae 2\u5f3a\u5236 3\u624b\u5de5\npublic int popTimes = 0;\/\/\u63d0\u9192\u6b21\u6570\npublic long popInterval = 0;\/\/\u63d0\u9192\u95f4\u9694\npublic int versionCode;\npublic String versionName = &quot;&quot;;\npublic String apkMd5;\/\/\u5305md5\u503c\npublic String apkUrl;\/\/APK\u7684CDN\u5916\u7f51\u4e0b\u8f7d\u5730\u5740\npublic long fileSize;\/\/APK\u6587\u4ef6\u7684\u5927\u5c0f\npubilc String imageUrl; \/\/ \u56fe\u7247url<\/code><\/pre>\n<h2>\u81ea\u5b9a\u4e49UI<\/h2>\n<p>Bugly\u63d0\u4f9b\u4e24\u79cd\u81ea\u5b9a\u4e49UI\u7684\u65b9\u5f0f\uff1a\u56fa\u5b9a\u63a7\u4ef6id\u65b9\u5f0f\u548c\u81ea\u5b9a\u4e49Activity\u4e24\u79cd\u65b9\u5f0f\uff1b<\/p>\n<h3>\u56fa\u5b9a\u63a7\u4ef6id<\/h3>\n<p>\u4f7f\u7528\u56fa\u5b9a\u63a7\u4ef6id\u65b9\u5f0f\uff0c\u5f39\u7a97\u7684\u751f\u547d\u5468\u671f\u4ecd\u7136\u7531\u66f4\u65b0sdk\u7ba1\u7406\uff0c\u7528\u6237\u53ef\u4ee5\u81ea\u5b9a\u4e49\u5347\u7ea7\u5f39\u7a97\u7684\u5e03\u5c40\u548c\u7f51\u7edc\u5f39\u7a97\u5e03\u5c40\uff0c\u4ec5\u9700\u8981\u5c06\u81ea\u5b9a\u4e49\u5e03\u5c40\u4e2d\u7684\u63a7\u4ef6tag\u8bbe\u7f6e\u4e3a\u6307\u5b9atag\uff0c\u5e76\u5728\u5728\u521d\u59cb\u5316\u65f6\u8bbe\u7f6e\u81ea\u5b9a\u4e49\u5e03\u5c40\u7684\u8d44\u6e90id\u4e0e\u56de\u8c03\u3002<\/p>\n<p>\u63a5\u53e3\u8bf4\u660e<\/p>\n<pre><code class=\"language-java\">\/*\u63a7\u4ef6\u56fa\u5b9atag\u5982\u4e0b*\/\npublic static final String TAG_IMG_BANNER = &quot;beta_upgrade_banner&quot;;\npublic static final String TAG_TITLE = &quot;beta_title&quot;;\npublic static final String TAG_UPGRADE_INFO = &quot;beta_upgrade_info&quot;;\npublic static final String TAG_UPGRADE_FEATURE = &quot;beta_upgrade_feature&quot;;\npublic static final String TAG_CANCEL_BUTTON = &quot;beta_cancel_button&quot;;\npublic static final String TAG_CONFIRM_BUTTON = &quot;beta_confirm_button&quot;;\npublic static final String TAG_TIP_MESSAGE = &quot;beta_tip_message&quot;;<\/code><\/pre>\n<p>tag\u4e0e\u754c\u9762\u63a7\u4ef6\u5bf9\u5e94\u5173\u7cfb\u5982\u4e0b:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/bugly.qq.com\/docs\/img\/beta\/advance\/1467275423177.png\" alt=\"tag\u4e0e\u754c\u9762\u63a7\u4ef6\u5bf9\u5e94\u5173\u7cfb\" \/><\/p>\n<pre><code class=\"language-java\">\/*\u81ea\u5b9a\u4e49\u6587\u6848\uff0c\u4fee\u6539\u540e\u7acb\u5373\u751f\u6548\uff0c\u9ed8\u8ba4\u63a7\u4ef6\u6587\u6848\u5982\u4e0b*\/\npublic static String strToastYourAreTheLatestVersion = &quot;\u4f60\u5df2\u7ecf\u662f\u6700\u65b0\u7248\u4e86&quot;;\npublic static String strToastCheckUpgradeError = &quot;\u68c0\u67e5\u65b0\u7248\u672c\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5&quot;;\npublic static String strToastCheckingUpgrade = &quot;\u6b63\u5728\u68c0\u67e5\uff0c\u8bf7\u7a0d\u5019...&quot;;\npublic static String strNotificationDownloading = &quot;\u6b63\u5728\u4e0b\u8f7d&quot;;\npublic static String strNotificationClickToView = &quot;\u70b9\u51fb\u67e5\u770b&quot;;\npublic static String strNotificationClickToInstall = &quot;\u70b9\u51fb\u5b89\u88c5&quot;;\npublic static String strNotificationClickToRetry = &quot;\u70b9\u51fb\u91cd\u8bd5&quot;;\npublic static String strNotificationDownloadSucc = &quot;\u4e0b\u8f7d\u5b8c\u6210&quot;;\npublic static String strNotificationDownloadError = &quot;\u4e0b\u8f7d\u5931\u8d25&quot;;\npublic static String strNotificationHaveNewVersion = &quot;\u6709\u65b0\u7248\u672c&quot;;\npublic static String strNetworkTipsMessage = &quot;\u4f60\u5df2\u5207\u6362\u5230\u79fb\u52a8\u7f51\u7edc\uff0c\u662f\u5426\u7ee7\u7eed\u5f53\u524d\u4e0b\u8f7d\uff1f&quot;;\npublic static String strNetworkTipsTitle = &quot;\u7f51\u7edc\u63d0\u793a&quot;;\npublic static String strNetworkTipsConfirmBtn = &quot;\u7ee7\u7eed\u4e0b\u8f7d&quot;;\npublic static String strNetworkTipsCancelBtn = &quot;\u53d6\u6d88&quot;;\npublic static String strUpgradeDialogVersionLabel = &quot;\u7248\u672c&quot;;\npublic static String strUpgradeDialogFileSizeLabel = &quot;\u5305\u5927\u5c0f&quot;;\npublic static String strUpgradeDialogUpdateTimeLabel = &quot;\u66f4\u65b0\u65f6\u95f4&quot;;\npublic static String strUpgradeDialogFeatureLabel = &quot;\u66f4\u65b0\u8bf4\u660e&quot;;\npublic static String strUpgradeDialogUpgradeBtn = &quot;\u7acb\u5373\u66f4\u65b0&quot;;\npublic static String strUpgradeDialogInstallBtn = &quot;\u5b89\u88c5&quot;;\npublic static String strUpgradeDialogRetryBtn = &quot;\u91cd\u8bd5&quot;;\npublic static String strUpgradeDialogContinueBtn = &quot;\u7ee7\u7eed&quot;;\npublic static String strUpgradeDialogCancelBtn = &quot;\u4e0b\u6b21\u518d\u8bf4&quot;;<\/code><\/pre>\n<pre><code class=\"language-java\">\/**\n * \u5347\u7ea7\u5f39\u7a97\u751f\u547d\u5468\u671f\u56de\u8c03\n * \u7528\u6237\u53ef\u4ee5\u5728\u5728\u5f39\u7a97\u7684\u5404\u4e2a\u751f\u547d\u5468\u671f\u4e2d\u56de\u8c03\n * \u5e76\u5728\u56de\u8c03\u4e2d\u4fee\u6539\u63a7\u4ef6\u5185\u5bb9\n *\/\npublic interface UILifecycleListener&lt;T&gt; {\n    \/**\n    * @param context   \u4e0a\u4e0b\u6587\n    * @param rootView  \u754c\u9762\u6839\u8282\u70b9\uff0c\u901a\u8fc7\u5b83\u83b7\u53d6\u5b50\u63a7\u4ef6\uff0c\u5e76\u8fdb\u884c\u8bbe\u7f6e\n    * @param t         \u81ea\u5b9a\u4e49\u6cdb\u578b\u53c2\u6570\uff0c\u7528\u4e8e\u56de\u8c03\u65f6\u4f20\u9012\u5176\u4ed6\u4fe1\u606f\n    *\/\n    void onCreate(Context context, View rootView, T t);\n    void onStart(Context context, View rootView, T t);\n    void onResume(Context context, View rootView, T t);\n    void onPause(Context context, View rootView, T t);\n    void onStop(Context context, View rootView, T t);\n    void onDestroy(Context context, View rootView, T t);\n}<\/code><\/pre>\n<p>\u793a\u4f8b<\/p>\n<pre><code class=\"language-java\">\/**\n * \u8bbe\u7f6e\u81ea\u5b9a\u4e49\u5347\u7ea7\u5bf9\u8bdd\u6846UI\u5e03\u5c40\n * \u6ce8\u610f\uff1a\u56e0\u4e3a\u8981\u4fdd\u6301\u63a5\u53e3\u7edf\u4e00\uff0c\u9700\u8981\u7528\u6237\u5728\u6307\u5b9a\u63a7\u4ef6\u6309\u7167\u4ee5\u4e0b\u65b9\u5f0f\u8bbe\u7f6etag\uff0c\u5426\u5219\u4f1a\u5f71\u54cd\u60a8\u7684\u6b63\u5e38\u4f7f\u7528\uff1a\n *  \u6807\u9898\uff1abeta_title\uff0c\u5982\uff1aandroid:tag=&quot;beta_title&quot;\n *  \u5347\u7ea7\u4fe1\u606f\uff1abeta_upgrade_info\uff0c\u5982\uff1aandroid:tag=&quot;beta_upgrade_info&quot;\n *  \u66f4\u65b0\u5c5e\u6027\uff1abeta_upgrade_feature\uff0c\u5982\uff1aandroid:tag=&quot;beta_upgrade_feature&quot;\n *  \u53d6\u6d88\u6309\u94ae\uff1abeta_cancel_button\uff0c\u5982\uff1aandroid:tag=&quot;beta_cancel_button&quot;\n *  \u786e\u5b9a\u6309\u94ae\uff1abeta_confirm_button\uff0c\u5982\uff1aandroid:tag=&quot;beta_confirm_button&quot;\n *  \u8be6\u89c1layout\/upgrade_dialog.xml\n *\/\nBeta.upgradeDialogLayoutId = R.layout.upgrade_dialog;\n\n\/**\n * \u8bbe\u7f6e\u81ea\u5b9a\u4e49tip\u5f39\u7a97UI\u5e03\u5c40\n * \u6ce8\u610f\uff1a\u56e0\u4e3a\u8981\u4fdd\u6301\u63a5\u53e3\u7edf\u4e00\uff0c\u9700\u8981\u7528\u6237\u5728\u6307\u5b9a\u63a7\u4ef6\u6309\u7167\u4ee5\u4e0b\u65b9\u5f0f\u8bbe\u7f6etag\uff0c\u5426\u5219\u4f1a\u5f71\u54cd\u60a8\u7684\u6b63\u5e38\u4f7f\u7528\uff1a\n *  \u6807\u9898\uff1abeta_title\uff0c\u5982\uff1aandroid:tag=&quot;beta_title&quot;\n *  \u63d0\u793a\u4fe1\u606f\uff1abeta_tip_message\uff0c\u5982\uff1aandroid:tag=&quot;beta_tip_message&quot;\n *  \u53d6\u6d88\u6309\u94ae\uff1abeta_cancel_button\uff0c\u5982\uff1aandroid:tag=&quot;beta_cancel_button&quot;\n *  \u786e\u5b9a\u6309\u94ae\uff1abeta_confirm_button\uff0c\u5982\uff1aandroid:tag=&quot;beta_confirm_button&quot;\n *  \u8be6\u89c1layout\/tips_dialog.xml\n *\/\nBeta.tipsDialogLayoutId = R.layout.tips_dialog;\n\n\/**\n * \u5982\u679c\u60f3\u76d1\u542c\u5347\u7ea7\u5bf9\u8bdd\u6846\u7684\u751f\u547d\u5468\u671f\u4e8b\u4ef6\uff0c\u53ef\u4ee5\u901a\u8fc7\u8bbe\u7f6eOnUILifecycleListener\u63a5\u53e3\n * \u56de\u8c03\u53c2\u6570\u89e3\u91ca\uff1a\n *  context - \u5f53\u524d\u5f39\u7a97\u4e0a\u4e0b\u6587\u5bf9\u8c61\n *  view - \u5347\u7ea7\u5bf9\u8bdd\u6846\u7684\u6839\u5e03\u5c40\u89c6\u56fe\uff0c\u53ef\u901a\u8fc7\u8fd9\u4e2a\u5bf9\u8c61\u67e5\u627e\u6307\u5b9aview\u63a7\u4ef6\n *  upgradeInfo - \u5347\u7ea7\u4fe1\u606f\n *\/\nBeta.upgradeDialogLifecycleListener = new UILifecycleListener&lt;UpgradeInfo&gt;() {\n    @Override\n    public void onCreate(Context context, View view, UpgradeInfo upgradeInfo) {\n        Log.d(TAG, &quot;onCreate&quot;);\n        \/\/ \u6ce8\uff1a\u53ef\u901a\u8fc7\u8fd9\u4e2a\u56de\u8c03\u65b9\u5f0f\u83b7\u53d6\u5e03\u5c40\u7684\u63a7\u4ef6\uff0c\u5982\u679c\u8bbe\u7f6e\u4e86id\uff0c\u53ef\u901a\u8fc7findViewById\u65b9\u5f0f\u83b7\u53d6\uff0c\u5982\u679c\u8bbe\u7f6e\u4e86tag\uff0c\u53ef\u4ee5\u901a\u8fc7findViewWithTag\uff0c\u5177\u4f53\u53c2\u8003\u4e0b\u9762\u4f8b\u5b50:\n\n        \/\/ \u901a\u8fc7id\u65b9\u5f0f\u83b7\u53d6\u63a7\u4ef6\uff0c\u5e76\u66f4\u6539imageview\u56fe\u7247\n        ImageView imageView = (ImageView) view.findViewById(R.id.imageview);\n        imageView.setImageResource(R.mipmap.ic_launcher);\n\n        \/\/ \u901a\u8fc7tag\u65b9\u5f0f\u83b7\u53d6\u63a7\u4ef6\uff0c\u5e76\u66f4\u6539\u5e03\u5c40\u5185\u5bb9\n        TextView textView = (TextView) view.findViewWithTag(&quot;textview&quot;);\n        textView.setText(&quot;my custom text&quot;);\n\n        \/\/ \u66f4\u591a\u7684\u64cd\u4f5c\uff1a\u6bd4\u5982\u8bbe\u7f6e\u63a7\u4ef6\u7684\u70b9\u51fb\u4e8b\u4ef6\n        imageView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Intent intent = new Intent(getApplicationContext(), OtherActivity.class);\n                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n                startActivity(intent);\n            }\n        });\n    }\n\n    @Override\n    public void onStart(Context context, View view, UpgradeInfo upgradeInfo) {\n        Log.d(TAG, &quot;onStart&quot;);\n    }\n\n    @Override\n    public void onResume(Context context, View view, UpgradeInfo upgradeInfo) {\n        Log.d(TAG, &quot;onResume&quot;);\n    }\n\n    @Override\n    public void onPause(Context context, View view, UpgradeInfo upgradeInfo) {\n        Log.d(TAG, &quot;onPause&quot;);\n    }\n\n    @Override\n    public void onStop(Context context, View view, UpgradeInfo upgradeInfo) {\n        Log.d(TAG, &quot;onStop&quot;);\n    }\n\n    @Override\n    public void onDestroy(Context context, View view, UpgradeInfo upgradeInfo) {\n        Log.d(TAG, &quot;onDestory&quot;);\n    }\n};<\/code><\/pre>\n<h3>\u81ea\u5b9a\u4e49Activity<\/h3>\n<p>\u4f7f\u7528\u81ea\u5b9a\u4e49Activity\u7684\u65b9\u5f0f\uff0c\u5f39\u7a97\u754c\u9762\u7684\u7ed8\u5236\u4e0e\u751f\u547d\u5468\u671f\u5747\u7531\u7528\u6237\u81ea\u5df1\u7ef4\u62a4\uff0cSDK\u8d1f\u8d23\u5728\u6536\u5230\u7b56\u7565\uff0c\u4e0b\u8f7d\u65f6\u56de\u8c03\u4e0e\u4e8b\u4ef6\u4e0a\u62a5\uff0c\u5e76\u63d0\u4f9b\u76f8\u5173\u63a5\u53e3\u63a7\u5236\u4efb\u52a1\u4e0b\u8f7d\uff0c\u83b7\u53d6\u4efb\u52a1\u72b6\u6001\u3002<\/p>\n<p>\u63a5\u53e3\u8bf4\u660e<\/p>\n<pre><code class=\"language-java\">\/**\n * \u76d1\u542c\u66f4\u65b0\u7684\u5404\u4e2a\u72b6\u6001\uff0c\u53ef\u4ee5\u66ff\u6362SDK\u5185\u7f6e\u7684toast\u63d0\u793a\n *\/\npublic interface UpgradeStateListener {\n    \/**\n     * \u66f4\u65b0\u5931\u8d25\n     * @param isManual  true:\u624b\u52a8\u68c0\u67e5 false:\u81ea\u52a8\u68c0\u67e5\n     *\/\n    void onUpgradeFailed(boolean isManual);\n\n    \/**\n     * \u66f4\u65b0\u6210\u529f\n     * @param isManual\n     *\/\n    void onUpgradeSuccess(boolean isManual);\n\n    \/**\n     * \u6ca1\u6709\u66f4\u65b0\n     * @param isManual\n     *\/\n    void onUpgradeNoVersion(boolean isManual);\n\n    \/**\n     * \u6b63\u5728\u66f4\u65b0\n     * @param isManual\n     *\/\n    void onUpgrading(boolean isManual);\n}\n\n\/**\n * \u66f4\u65b0\u76d1\u542c\uff0c\u6536\u5230\u7b56\u7565\u65f6\u56de\u8c03\n *\/\npublic interface UpgradeListener {\n    \/**\n     * \u63a5\u6536\u5230\u66f4\u65b0\u7b56\u7565\n     * @param ret  0:\u6b63\u5e38 -1:\u8bf7\u6c42\u5931\u8d25\n     * @param strategy \u66f4\u65b0\u7b56\u7565\n     * @param isManual  true:\u624b\u52a8\u8bf7\u6c42 false:\u81ea\u52a8\u8bf7\u6c42\n     * @param isSilence  true:\u4e0d\u5f39\u7a97 false:\u5f39\u7a97\n     * @return \u662f\u5426\u653e\u5f03SDK\u5904\u7406\u6b64\u7b56\u7565\uff0ctrue:SDK\u5c06\u4e0d\u4f1a\u5f39\u7a97\uff0c\u7b56\u7565\u4ea4\u7531app\u81ea\u5df1\u5904\u7406\n     *\/\n    void onUpgrade(int ret, UpgradeInfo strategy, boolean isManual, boolean isSilence);\n}\n\n\/**\n * \u4e0b\u8f7d\u76d1\u542c\uff0c\u4e0b\u8f7d\u65f6\u56de\u8c03\n *\/\npublic interface DownloadListener {\n    \/**\n     * @param task \u4e0b\u8f7d\u4efb\u52a1\n     *\/\n    void onReceive(DownloadTask task);\n    \/**\n     * @param task \u4e0b\u8f7d\u4efb\u52a1\n     *\/\n    void onCompleted(DownloadTask task);\n    \/**\n     * \u4e0b\u8f7d\u5931\u8d25\n     *\n     * @param task \u4e0b\u8f7d\u4efb\u52a1\n     * @param code \u9519\u8bef\u7801\n     * @param extMsg \u9519\u8bef\u4fe1\u606f\n     *\/\n    void onFailed(DownloadTask task, int code, String extMsg);\n}\n\n\/**\n * \u6ce8\u518c\u4e0b\u8f7d\u76d1\u542c\n * \u5728\u5f39\u7a97Activity\u7684onCreate\u4e2d\u8c03\u7528\n * @param dl \u7528\u6237\u81ea\u5df1\u5b9e\u73b0\u7684\u4e0b\u8f7d\u63a5\u53e3\n *\/\npublic static void registerDownloadListener(DownloadListener dl)\n\n\/**\n * \u6ce8\u9500\u4e0b\u8f7d\u76d1\u542c\n * \u5728\u5f39\u7a97Activity\u7684onDestroy\u4e2d\u8c03\u7528\uff0c\u4e0d\u4f7f\u7528\u4f1a\u5bfc\u81f4\u5185\u5b58\u6cc4\u6f0f\n *\/\npublic static void unregisterDownloadListener()\n\n\/**\n * \u63a7\u5236\u4e0b\u8f7d\n * \u63a7\u5236\u4efb\u52a1\u7684\u4e0b\u8f7d\u6682\u505c\u7b49\uff0c\u7528\u4e8e\u4e0b\u8f7d\u6309\u94ae\u7684\u76d1\u542c\n * @return \u8fd4\u56de\u4e0b\u8f7d\u4efb\u52a1\n *\/\npublic static DownloadTask startDownload()\n\n\/**\n * \u53d6\u6d88\u4e0b\u8f7d\n * \u7528\u4e8e\u53d6\u6d88\u6309\u94ae\u7684\u76d1\u542c\n *\/\npublic static void cancelDownload()\n\n\/**\n * \u83b7\u53d6\u4e0b\u8f7d\u4efb\u52a1\u4fe1\u606f\n * \u521d\u59cb\u5316\u5f39\u7a97\u65f6\u83b7\u53d6\u4e0b\u8f7d\u4efb\u52a1\u4fe1\u606f\n * @return \u4e0b\u8f7d\u4efb\u52a1\n *\/\npublic static DownloadTask getStrategyTask()\n\n\/**\n * \u83b7\u53d6\u672c\u5730\u5df2\u6709\u5347\u7ea7\u7b56\u7565\n *\n * @return\n *\/\npublic static synchronized UpgradeInfo getUpgradeInfo()<\/code><\/pre>\n<p>\u793a\u4f8b<\/p>\n<pre><code class=\"language-java\">\/* \u5728Application\u4e2d\u521d\u59cb\u5316\u65f6\u8bbe\u7f6e\u76d1\u542c\uff0c\u76d1\u542c\u7b56\u7565\u7684\u6536\u53d6 *\/\nBeta.upgradeListener = new UpgradeListener() {\n    @Override\n    public void onUpgrade(int ret,UpgradeInfo strategy, boolean isManual, boolean isSilence) {\n        if (strategy != null) {\n            Intent i = new Intent();\n            i.setClass(getApplicationContext(), UpgradeActivity.class);\n            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n            startActivity(i);\n        } else {\n            Toast.makeText(BaseApplication.this, &quot;\u6ca1\u6709\u66f4\u65b0&quot;, Toast.LENGTH_LONG).show();\n        }\n    }\n};\n\n\/* \u8bbe\u7f6e\u66f4\u65b0\u72b6\u6001\u56de\u8c03\u63a5\u53e3 *\/\nBeta.upgradeStateListener = new UpgradeStateListener() {\n    @Override\n    public void onUpgradeSuccess(boolean isManual) {\n        Toast.makeText(getApplicationContext(), &quot;UPGRADE_SUCCESS&quot;, Toast.LENGTH_SHORT).show();\n    }\n\n    @Override\n    public void onUpgradeFailed(boolean isManual) {\n        Toast.makeText(getApplicationContext(), &quot;UPGRADE_FAILED&quot;, Toast.LENGTH_SHORT).show();\n    }\n\n    @Override\n    public void onUpgrading(boolean isManual) {\n        Toast.makeText(getApplicationContext(), &quot;UPGRADE_CHECKING&quot;, Toast.LENGTH_SHORT).show();\n    }\n\n    @Override\n    public void onUpgradeNoVersion(boolean isManual) {\n        Toast.makeText(getApplicationContext(), &quot;UPGRADE_NO_VERSION&quot;, Toast.LENGTH_SHORT).show();\n    }\n};<\/code><\/pre>\n<pre><code class=\"language-java\">\/**\n * \u66f4\u65b0\u5f39\u7a97demo\n *\/    \npublic class UpgradeActivity extends Activity {\n    private TextView tv;\n    private TextView title;\n    private TextView version;\n    private TextView size;\n    private TextView time;\n    private TextView content;\n    private Button cancel;\n    private Button start;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        this.requestWindowFeature(Window.FEATURE_NO_TITLE);\n        setContentView(R.layout.activity_upgrade);\n        tv = getView(R.id.tv);\n        title = getView(R.id.title);\n        version = getView(R.id.version);\n        size = getView(R.id.size);\n        time = getView(R.id.time);\n        content = getView(R.id.content);\n        cancel = getView(R.id.cancel);\n        start = getView(R.id.start);\n\n        \/*\u83b7\u53d6\u4e0b\u8f7d\u4efb\u52a1\uff0c\u521d\u59cb\u5316\u754c\u9762\u4fe1\u606f*\/\n        updateBtn(Beta.getStrategyTask());\n        tv.setText(tv.getText().toString() + Beta.getStrategyTask().getSavedLength() + &quot;&quot;);\n\n        \/*\u83b7\u53d6\u7b56\u7565\u4fe1\u606f\uff0c\u521d\u59cb\u5316\u754c\u9762\u4fe1\u606f*\/\n        title.setText(title.getText().toString() + Beta.getUpgradeInfo().title);\n        version.setText(version.getText().toString() + Beta.getUpgradeInfo().versionName);\n        size.setText(size.getText().toString() + Beta.getUpgradeInfo().fileSize + &quot;&quot;);\n        time.setText(time.getText().toString() + Beta.getUpgradeInfo().publishTime + &quot;&quot;);\n        content.setText(Beta.getUpgradeInfo().newFeature);\n\n        \/*\u4e3a\u4e0b\u8f7d\u6309\u94ae\u8bbe\u7f6e\u76d1\u542c*\/\n        start.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                DownloadTask task = Beta.startDownload();\n                updateBtn(task);\n                if (task.getStatus() == DownloadTask.DOWNLOADING) {\n                    finish();\n                }\n            }\n        });\n\n        \/*\u4e3a\u53d6\u6d88\u6309\u94ae\u8bbe\u7f6e\u76d1\u542c*\/\n        cancel.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Beta.cancelDownload();\n                finish();\n            }\n        });\n\n        \/*\u6ce8\u518c\u4e0b\u8f7d\u76d1\u542c\uff0c\u76d1\u542c\u4e0b\u8f7d\u4e8b\u4ef6*\/\n        Beta.registerDownloadListener(new DownloadListener() {\n            @Override\n            public void onReceive(DownloadTask task) {\n                updateBtn(task);\n                tv.setText(task.getSavedLength() + &quot;&quot;);\n            }\n\n            @Override\n            public void onCompleted(DownloadTask task) {\n                updateBtn(task);\n                tv.setText(task.getSavedLength() + &quot;&quot;);\n            }\n\n            @Override\n            public void onFailed(DownloadTask task, int code, String extMsg) {\n                updateBtn(task);\n                tv.setText(&quot;failed&quot;);\n            }\n        });\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n    }\n\n    @Override\n    protected void onStop() {\n        super.onStop();\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n\n        \/*\u6ce8\u9500\u4e0b\u8f7d\u76d1\u542c*\/\n        Beta.unregisterDownloadListener();\n    }\n\n    public void updateBtn(DownloadTask task) {\n\n        \/*\u6839\u636e\u4e0b\u8f7d\u4efb\u52a1\u72b6\u6001\u8bbe\u7f6e\u6309\u94ae*\/\n        switch (task.getStatus()) {\n            case DownloadTask.INIT:\n            case DownloadTask.DELETED:\n            case DownloadTask.FAILED: {\n                start.setText(&quot;\u5f00\u59cb\u4e0b\u8f7d&quot;);\n            }\n            break;\n            case DownloadTask.COMPLETE: {\n                start.setText(&quot;\u5b89\u88c5&quot;);\n            }\n            break;\n            case DownloadTask.DOWNLOADING: {\n                start.setText(&quot;\u6682\u505c&quot;);\n            }\n            break;\n            case DownloadTask.PAUSED: {\n                start.setText(&quot;\u7ee7\u7eed\u4e0b\u8f7d&quot;);\n            }\n            break;\n        }\n    }\n\n    public &lt;T extends View&gt; T getView(int id) {\n        return (T) findViewById(id);\n    }\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Beta\u7c7b \u63d0\u4f9bBeta\u7c7b\u4f5c\u4e3aBugly\u7684\u521d\u59cb\u5316\u6269\u5c55\uff0c\u901a\u8fc7Beta\u7c7b\u53ef\u4ee5\u4fee\u6539\u5347\u7ea7\u7684\u68c0\u6d4b\u65f6\u673a\uff0c\u754c\u9762\u5143\u7d20\u4ee5\u53ca\u81ea\u5b9a\u4e49 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[311],"tags":[200],"class_list":["post-1869","post","type-post","status-publish","format-standard","hentry","category-android-advance","tag-bugly"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1869","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1869"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1869\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1869"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1869"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1869"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}