赞
踩
最近项目需要做一个版本更新的功能,版本更新想起来不就是检查到有新版本,就给一个弹窗,提示用户更新就是了嘛,不难。
是的,不难,大家一下子可以想到的就是利用dialog来做。dialog进行弹窗提示,可以自定义布局,实现自己想要的效果,挺好的,但是有一点不好的就是需要一个窗体进行依附。但是可能会获取不到一个依附的窗体,这就是比较蛋疼的问题了。想我之前做的单点登录问题就是了。要一个窗体进行依附,弄是弄出来了,但是绕了不少弯路。
所以这里我给大家介绍一个给好的方法。那就是利用activity进行伪弹窗,来替代dialog,不再需要一个窗体依附了。
首先是我们的activity的主题theme,sdk中有很多的主题,我们需要的是其中一个
@android:style/Theme.Dialog
这个只是系统自带的主题,我们继承,然后重写一下他的设置,不说了,具体的theme贴出来,如下:
- <style name="DialogTheme" parent="@android:style/Theme.Dialog">
- <item name="android:windowFrame">@null</item>
- <!-- 边框 -->
- <item name="android:windowIsFloating">true</item>
- <!-- 是否浮现在activity之上 -->
- <item name="android:windowIsTranslucent">true</item>
- <!-- 半透明 -->
- <item name="android:windowNoTitle">true</item>
- <item name="android:windowBackground">@android:color/transparent</item>
- <item name="android:background">@android:color/transparent</item>
- <item name="android:backgroundDimEnabled">true</item>
- <!-- 模糊 -->
- </style>
然后在我们的声明文件androidminifest中声明时用上就OK了。如下:
- <activity
- android:name=".ui.common.UpgradeDialogActivity"
- android:launchMode="singleTask"
- android:theme="@style/DialogTheme" />
这里说明一点,android:launchMode="singleTask"
这个属性设置,因为升级弹窗嘛,只能显示一个,但是用户可能连续点了几遍,如果每次网络请求回调都来启动这个activity的话
,那就有了n多个的弹窗了,显然这是不适合用户体验的。这个启动模式是“栈唯一”原则,如果我们程序的栈中有了这个activity的
实例,那么就将他拿出来展示,而不是重新new一个。更多的关于启动模式知识请戳android启动模式简介 然后就是我们在activity里头进行处理你的逻辑了,弹窗式的activity处理和标准的没有区别;
- /**
- * 更新版本提示弹窗
- * <p>
- * Created by yaojt on 16/12/27.
- */
-
- public class UpgradeDialogActivity extends Activity implements View.OnClickListener {
-
- /**
- * 启动升级弹窗
- *
- * @param activity activity
- * @param newAppVersionEntity newAppVersionEntity
- * @param isNeedIgnore 是否需要"不再提醒"复选框提示,fales:不需要,true:需要
- */
- public static void startUpgradeDialogActivity(Activity activity, NewAppVersionEntity newAppVersionEntity,
- boolean isNeedIgnore) {
- Intent intent = new Intent(activity, UpgradeDialogActivity.class);
- intent.putExtra("newAppVersionEntity", newAppVersionEntity);
- intent.putExtra("isNeedIgnore", isNeedIgnore);
- activity.startActivity(intent);
- }
-
- /* apk下载 url */
- private String downloadUrl;
-
- /* 是否强制升级 1非强制,2强制 */
- private String isCompulsionPush;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- /* 去除Activity的标题栏 */
- requestWindowFeature(Window.FEATURE_NO_TITLE);
-
- setContentView(R.layout.upgrade_appversion_dialog_layout);
-
- /** 设置宽度为屏幕的0.9*/
- WindowManager windowManager = getWindowManager();
- /* 获取屏幕宽、高 */
- Display display = windowManager.getDefaultDisplay();
- /* 获取对话框当前的参数值 */
- WindowManager.LayoutParams p = getWindow().getAttributes();
- /* 宽度设置为屏幕的1 */
- p.width = (int) (display.getWidth() * 0.9);
- /* 设置透明度,0.0为完全透明,1.0为完全不透明 */
- p.alpha = 0.95f;
- /* 设置布局参数 */
- getWindow().setAttributes(p);
-
- // getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT,
- // ViewGroup.LayoutParams.WRAP_CONTENT);
-
- /* 设置点击弹框外部不可消失 */
- setFinishOnTouchOutside(false);
-
- initDate();
- }
-
- /* 版本号 */
- private int versionCode;
-
- /* 是否忽此版本 */
- private boolean isNeedIgnore;
-
- /**
- * 初始化数据
- */
- public void initDate() {
- Intent intent = getIntent();
- NewAppVersionEntity newAppVersionEntity = null;
- if (intent != null) {
- newAppVersionEntity = (NewAppVersionEntity) intent.getSerializableExtra("newAppVersionEntity");
- isNeedIgnore = intent.getBooleanExtra("isNeedIgnore", false);
- }
- if (newAppVersionEntity != null) {
-
- /* 1:非强制,2:强制 */
- isCompulsionPush = newAppVersionEntity.getIsCompulsionPush();
-
- downloadUrl = newAppVersionEntity.getDownloadUrl();
-
- /* 版本名称 */
- versionCode = newAppVersionEntity.getVersionCode();
- String verNameAndCode = getString(R.string.versionName) + " "
- + newAppVersionEntity.getVersionNum()
- + " " + getString(R.string.versionCode) + versionCode;
- setVerNameAndCode(verNameAndCode);
-
- /* 新版本大小 */
- setApkSize(newAppVersionEntity.getAppSize());
-
- /* 版本更新信息 */
- setUpdateDesc(newAppVersionEntity.getVersionDesc());
-
- /* 不再提示,当为2强制更新时,也不需要不再提示复选框 */
- if ("2".equals(isCompulsionPush)) isNeedIgnore = false;
- setIgnoreCheckBox(isNeedIgnore);
-
- /* 取消按钮是否可以点击 */
- setCancelBtnEnable(isCompulsionPush);
-
- /* 升级按钮 */
- Button btn_newVerOk = (Button) findViewById(R.id.btn_newVerOk);
- btn_newVerOk.setOnClickListener(this);
- }
- }
-
- @Override
- public void onClick(View v) {
-
- /* 是否记住忽略新版本,目前只有两个按钮点击事件 */
- saveIsIgnoreNewVersion(versionCode);
-
- switch (v.getId()) {
- /* 确定升级 */
- case btn_newVerOk:
- downloadApk(downloadUrl, isCompulsionPush);
- saveUserPref(false, versionCode);
- break;
-
- /* 取消 */
- case btn_newVerCancel:
- this.finish();
- break;
- }
- }
-
- /**
- * 设置"不再提示"复选框是否可见
- *
- * @param isNeedIgnore isNeedIgnore
- */
- void setIgnoreCheckBox(boolean isNeedIgnore) {
- CheckBox chb_ignoreNewVersion = (CheckBox) findViewById(R.id.chb_ignoreNewVersion);
- if (!isNeedIgnore) {
- chb_ignoreNewVersion.setVisibility(View.GONE);
- }
- }
-
- /**
- * 设置取消按钮是否可用
- *
- * @param isCompulsionPush isCompulsionPush
- */
- void setCancelBtnEnable(String isCompulsionPush) {
- Button btn_newVerCancel = (Button) findViewById(R.id.btn_newVerCancel);
- if ("1".equals(isCompulsionPush)) { //判断是否强制更新
- /* 1-非强制更新 */
- btn_newVerCancel.setOnClickListener(this);
- } else {
- /* 2-强制更新 */
- // if (!isNeedIgnore) { //表明是用户手动检查进来的弹框,暂时不理会强制更新
- // btn_newVerCancel.setOnClickListener(this);
- // } else {
- btn_newVerCancel.setBackgroundColor(getResources().getColor(R.color.black99));
- btn_newVerCancel.setTextColor(getResources().getColor(R.color.black66));
- btn_newVerCancel.setEnabled(false);
- // }
- }
- }
-
- /**
- * 设置版本更新描述信息
- *
- * @param desc desc
- */
- void setUpdateDesc(String desc) {
- TextView tv_newVersionMsg = (TextView) findViewById(R.id.tv_newVersionMsg);
- tv_newVersionMsg.setText(desc);
- }
-
- /**
- * 设置apk的大小
- *
- * @param apkSize apkSize
- */
- void setApkSize(String apkSize) {
- float kSize;
- try {
- kSize = Float.valueOf(apkSize);
- } catch (Exception e) {
- e.printStackTrace();
- kSize = 0;
- }
- float size = kSize / 1024 / 1024;
- DecimalFormat mFormat = new DecimalFormat("##.##");
- TextView tv_newVersionSize = (TextView) findViewById(R.id.tv_newVersionSize);
- tv_newVersionSize.setText(getString(R.string.apkSize) + mFormat.format(size)
- + getResources().getString(R.string.apkSizeUnit));
- }
-
- /**
- * 设置版本名称和版本的build号
- *
- * @param text text
- */
- void setVerNameAndCode(String text) {
- TextView tv_newVersionNum = (TextView) findViewById(R.id.tv_newVersionNum);
- tv_newVersionNum.setText(text);
- }
-
- /**
- * 保存不再提醒更新提示
- */
- void saveIsIgnoreNewVersion(int versionCode) {
- if ("2".equals(isCompulsionPush)) {
- saveUserPref(false, versionCode);
- return;
- }
- CheckBox chb_ignoreNewVersion = (CheckBox) findViewById(R.id.chb_ignoreNewVersion);
- if (chb_ignoreNewVersion.isChecked()) {
- saveUserPref(true, versionCode);
- }
- }
-
- /**
- * 保存用户的偏好设置
- */
- void saveUserPref(boolean isIgnore, int versionCode) {
- AppSharedPreferences appSharedPreferences = new AppSharedPreferences(this);
- if (isIgnore) appSharedPreferences.saveLastIgnoreVerCode(versionCode);
- appSharedPreferences.saveIsIgnoreUpgradeNotify(isIgnore);
- }
-
- /**
- * 下载apk
- *
- * @param downloadUrl downloadUrl
- * @param isCompulsionPush isCompulsionPush
- */
- void downloadApk(String downloadUrl, String isCompulsionPush) {
- if (downloadUrl != null) {
- new DownloadApkUtil(this).downLoadApk(downloadUrl, isCompulsionPush);
- }
- }
-
- /**禁用返回键*/
- @Override
- public void onBackPressed() {
- // super.onBackPressed();
- }
-
- /*
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if (requestCode == 1001){
- if (resultCode == RESULT_OK){
- toast("更新成功");
- }
- }
- }
- */
-
- }
这个是我自己的代码,不适合大家用,但是思路是差不多的,布局就不贴上来了,大概就是这么回事。代码里面有注释;
最后的最后,就是启动这个activity啦;
UpgradeDialogActivity.startUpgradeDialogActivity(activity, newAppVersionEntity, true);
最后的效果就是一个类似dialog的弹窗,覆盖在之前的activity上面,伪dialog弹窗就完成了。
如有任何疑问,请及时与我联系。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。