当前位置:   article > 正文

android之利用activity进行弹窗dialog显示版本更新_android 写一个弹窗更新页面如何实现

android 写一个弹窗更新页面如何实现


最近项目需要做一个版本更新的功能,版本更新想起来不就是检查到有新版本,就给一个弹窗,提示用户更新就是了嘛,不难。


是的,不难,大家一下子可以想到的就是利用dialog来做。dialog进行弹窗提示,可以自定义布局,实现自己想要的效果,挺好的,但是有一点不好的就是需要一个窗体进行依附。但是可能会获取不到一个依附的窗体,这就是比较蛋疼的问题了。想我之前做的单点登录问题就是了。要一个窗体进行依附,弄是弄出来了,但是绕了不少弯路。


所以这里我给大家介绍一个给好的方法。那就是利用activity进行伪弹窗,来替代dialog,不再需要一个窗体依附了。


首先是我们的activity的主题theme,sdk中有很多的主题,我们需要的是其中一个

@android:style/Theme.Dialog
这个只是系统自带的主题,我们继承,然后重写一下他的设置,不说了,具体的theme贴出来,如下:
  1. <style name="DialogTheme" parent="@android:style/Theme.Dialog">
  2. <item name="android:windowFrame">@null</item>
  3. <!-- 边框 -->
  4. <item name="android:windowIsFloating">true</item>
  5. <!-- 是否浮现在activity之上 -->
  6. <item name="android:windowIsTranslucent">true</item>
  7. <!-- 半透明 -->
  8. <item name="android:windowNoTitle">true</item>
  9. <item name="android:windowBackground">@android:color/transparent</item>
  10. <item name="android:background">@android:color/transparent</item>
  11. <item name="android:backgroundDimEnabled">true</item>
  12. <!-- 模糊 -->
  13. </style>
然后在我们的声明文件androidminifest中声明时用上就OK了。如下:
  1. <activity
  2. android:name=".ui.common.UpgradeDialogActivity"
  3. android:launchMode="singleTask"
  4. android:theme="@style/DialogTheme" />
这里说明一点,
android:launchMode="singleTask"
这个属性设置,因为升级弹窗嘛,只能显示一个,但是用户可能连续点了几遍,如果每次网络请求回调都来启动这个activity的话
,那就有了n多个的弹窗了,显然这是不适合用户体验的。这个启动模式是“栈唯一”原则,如果我们程序的栈中有了这个activity的
实例,那么就将他拿出来展示,而不是重新new一个。更多的关于启动模式知识请戳android启动模式简介

然后就是我们在activity里头进行处理你的逻辑了,弹窗式的activity处理和标准的没有区别;
  1. /**
  2. * 更新版本提示弹窗
  3. * <p>
  4. * Created by yaojt on 16/12/27.
  5. */
  6. public class UpgradeDialogActivity extends Activity implements View.OnClickListener {
  7. /**
  8. * 启动升级弹窗
  9. *
  10. * @param activity activity
  11. * @param newAppVersionEntity newAppVersionEntity
  12. * @param isNeedIgnore 是否需要"不再提醒"复选框提示,fales:不需要,true:需要
  13. */
  14. public static void startUpgradeDialogActivity(Activity activity, NewAppVersionEntity newAppVersionEntity,
  15. boolean isNeedIgnore) {
  16. Intent intent = new Intent(activity, UpgradeDialogActivity.class);
  17. intent.putExtra("newAppVersionEntity", newAppVersionEntity);
  18. intent.putExtra("isNeedIgnore", isNeedIgnore);
  19. activity.startActivity(intent);
  20. }
  21. /* apk下载 url */
  22. private String downloadUrl;
  23. /* 是否强制升级 1非强制,2强制 */
  24. private String isCompulsionPush;
  25. @Override
  26. protected void onCreate(Bundle savedInstanceState) {
  27. super.onCreate(savedInstanceState);
  28. /* 去除Activity的标题栏 */
  29. requestWindowFeature(Window.FEATURE_NO_TITLE);
  30. setContentView(R.layout.upgrade_appversion_dialog_layout);
  31. /** 设置宽度为屏幕的0.9*/
  32. WindowManager windowManager = getWindowManager();
  33. /* 获取屏幕宽、高 */
  34. Display display = windowManager.getDefaultDisplay();
  35. /* 获取对话框当前的参数值 */
  36. WindowManager.LayoutParams p = getWindow().getAttributes();
  37. /* 宽度设置为屏幕的1 */
  38. p.width = (int) (display.getWidth() * 0.9);
  39. /* 设置透明度,0.0为完全透明,1.0为完全不透明 */
  40. p.alpha = 0.95f;
  41. /* 设置布局参数 */
  42. getWindow().setAttributes(p);
  43. // getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT,
  44. // ViewGroup.LayoutParams.WRAP_CONTENT);
  45. /* 设置点击弹框外部不可消失 */
  46. setFinishOnTouchOutside(false);
  47. initDate();
  48. }
  49. /* 版本号 */
  50. private int versionCode;
  51. /* 是否忽此版本 */
  52. private boolean isNeedIgnore;
  53. /**
  54. * 初始化数据
  55. */
  56. public void initDate() {
  57. Intent intent = getIntent();
  58. NewAppVersionEntity newAppVersionEntity = null;
  59. if (intent != null) {
  60. newAppVersionEntity = (NewAppVersionEntity) intent.getSerializableExtra("newAppVersionEntity");
  61. isNeedIgnore = intent.getBooleanExtra("isNeedIgnore", false);
  62. }
  63. if (newAppVersionEntity != null) {
  64. /* 1:非强制,2:强制 */
  65. isCompulsionPush = newAppVersionEntity.getIsCompulsionPush();
  66. downloadUrl = newAppVersionEntity.getDownloadUrl();
  67. /* 版本名称 */
  68. versionCode = newAppVersionEntity.getVersionCode();
  69. String verNameAndCode = getString(R.string.versionName) + " "
  70. + newAppVersionEntity.getVersionNum()
  71. + " " + getString(R.string.versionCode) + versionCode;
  72. setVerNameAndCode(verNameAndCode);
  73. /* 新版本大小 */
  74. setApkSize(newAppVersionEntity.getAppSize());
  75. /* 版本更新信息 */
  76. setUpdateDesc(newAppVersionEntity.getVersionDesc());
  77. /* 不再提示,当为2强制更新时,也不需要不再提示复选框 */
  78. if ("2".equals(isCompulsionPush)) isNeedIgnore = false;
  79. setIgnoreCheckBox(isNeedIgnore);
  80. /* 取消按钮是否可以点击 */
  81. setCancelBtnEnable(isCompulsionPush);
  82. /* 升级按钮 */
  83. Button btn_newVerOk = (Button) findViewById(R.id.btn_newVerOk);
  84. btn_newVerOk.setOnClickListener(this);
  85. }
  86. }
  87. @Override
  88. public void onClick(View v) {
  89. /* 是否记住忽略新版本,目前只有两个按钮点击事件 */
  90. saveIsIgnoreNewVersion(versionCode);
  91. switch (v.getId()) {
  92. /* 确定升级 */
  93. case btn_newVerOk:
  94. downloadApk(downloadUrl, isCompulsionPush);
  95. saveUserPref(false, versionCode);
  96. break;
  97. /* 取消 */
  98. case btn_newVerCancel:
  99. this.finish();
  100. break;
  101. }
  102. }
  103. /**
  104. * 设置"不再提示"复选框是否可见
  105. *
  106. * @param isNeedIgnore isNeedIgnore
  107. */
  108. void setIgnoreCheckBox(boolean isNeedIgnore) {
  109. CheckBox chb_ignoreNewVersion = (CheckBox) findViewById(R.id.chb_ignoreNewVersion);
  110. if (!isNeedIgnore) {
  111. chb_ignoreNewVersion.setVisibility(View.GONE);
  112. }
  113. }
  114. /**
  115. * 设置取消按钮是否可用
  116. *
  117. * @param isCompulsionPush isCompulsionPush
  118. */
  119. void setCancelBtnEnable(String isCompulsionPush) {
  120. Button btn_newVerCancel = (Button) findViewById(R.id.btn_newVerCancel);
  121. if ("1".equals(isCompulsionPush)) { //判断是否强制更新
  122. /* 1-非强制更新 */
  123. btn_newVerCancel.setOnClickListener(this);
  124. } else {
  125. /* 2-强制更新 */
  126. // if (!isNeedIgnore) { //表明是用户手动检查进来的弹框,暂时不理会强制更新
  127. // btn_newVerCancel.setOnClickListener(this);
  128. // } else {
  129. btn_newVerCancel.setBackgroundColor(getResources().getColor(R.color.black99));
  130. btn_newVerCancel.setTextColor(getResources().getColor(R.color.black66));
  131. btn_newVerCancel.setEnabled(false);
  132. // }
  133. }
  134. }
  135. /**
  136. * 设置版本更新描述信息
  137. *
  138. * @param desc desc
  139. */
  140. void setUpdateDesc(String desc) {
  141. TextView tv_newVersionMsg = (TextView) findViewById(R.id.tv_newVersionMsg);
  142. tv_newVersionMsg.setText(desc);
  143. }
  144. /**
  145. * 设置apk的大小
  146. *
  147. * @param apkSize apkSize
  148. */
  149. void setApkSize(String apkSize) {
  150. float kSize;
  151. try {
  152. kSize = Float.valueOf(apkSize);
  153. } catch (Exception e) {
  154. e.printStackTrace();
  155. kSize = 0;
  156. }
  157. float size = kSize / 1024 / 1024;
  158. DecimalFormat mFormat = new DecimalFormat("##.##");
  159. TextView tv_newVersionSize = (TextView) findViewById(R.id.tv_newVersionSize);
  160. tv_newVersionSize.setText(getString(R.string.apkSize) + mFormat.format(size)
  161. + getResources().getString(R.string.apkSizeUnit));
  162. }
  163. /**
  164. * 设置版本名称和版本的build号
  165. *
  166. * @param text text
  167. */
  168. void setVerNameAndCode(String text) {
  169. TextView tv_newVersionNum = (TextView) findViewById(R.id.tv_newVersionNum);
  170. tv_newVersionNum.setText(text);
  171. }
  172. /**
  173. * 保存不再提醒更新提示
  174. */
  175. void saveIsIgnoreNewVersion(int versionCode) {
  176. if ("2".equals(isCompulsionPush)) {
  177. saveUserPref(false, versionCode);
  178. return;
  179. }
  180. CheckBox chb_ignoreNewVersion = (CheckBox) findViewById(R.id.chb_ignoreNewVersion);
  181. if (chb_ignoreNewVersion.isChecked()) {
  182. saveUserPref(true, versionCode);
  183. }
  184. }
  185. /**
  186. * 保存用户的偏好设置
  187. */
  188. void saveUserPref(boolean isIgnore, int versionCode) {
  189. AppSharedPreferences appSharedPreferences = new AppSharedPreferences(this);
  190. if (isIgnore) appSharedPreferences.saveLastIgnoreVerCode(versionCode);
  191. appSharedPreferences.saveIsIgnoreUpgradeNotify(isIgnore);
  192. }
  193. /**
  194. * 下载apk
  195. *
  196. * @param downloadUrl downloadUrl
  197. * @param isCompulsionPush isCompulsionPush
  198. */
  199. void downloadApk(String downloadUrl, String isCompulsionPush) {
  200. if (downloadUrl != null) {
  201. new DownloadApkUtil(this).downLoadApk(downloadUrl, isCompulsionPush);
  202. }
  203. }
  204. /**禁用返回键*/
  205. @Override
  206. public void onBackPressed() {
  207. // super.onBackPressed();
  208. }
  209. /*
  210. @Override
  211. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  212. super.onActivityResult(requestCode, resultCode, data);
  213. if (requestCode == 1001){
  214. if (resultCode == RESULT_OK){
  215. toast("更新成功");
  216. }
  217. }
  218. }
  219. */
  220. }

这个是我自己的代码,不适合大家用,但是思路是差不多的,布局就不贴上来了,大概就是这么回事。代码里面有注释;
 
最后的最后,就是启动这个activity啦;
                    UpgradeDialogActivity.startUpgradeDialogActivity(activity, newAppVersionEntity, true);

最后的效果就是一个类似dialog的弹窗,覆盖在之前的activity上面,伪dialog弹窗就完成了。
 
如有任何疑问,请及时与我联系。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/225216
推荐阅读
相关标签
  

闽ICP备14008679号