android之利用activity进行弹窗dialog显示版本更新


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


是的,不难,大家一下子可以想到的就是利用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弹窗就完成了。
 
如有任何疑问,请及时与我联系。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,可以使用`Dialog`或`AlertDialog`来在一个Activity中以弹窗形式显示一个Activity。可以通过以下步骤来实现: 1. 在当前Activity的Java文件中,创建一个`Dialog`或`AlertDialog`对象。例如: ```java Dialog dialog = new Dialog(this); dialog.setContentView(R.layout.activity_another); dialog.show(); ``` 其中,`activity_another`是你想要在弹窗显示Activity的布局文件的名称。 2. 如果使用`AlertDialog`,还可以在创建对象时设置标题、消息等相关属性。例如: ```java AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("My Dialog"); builder.setMessage("This is a dialog message."); builder.setView(R.layout.activity_another); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 点击“OK”按钮后的操作 } }); AlertDialog dialog = builder.create(); dialog.show(); ``` 其中,`setPositiveButton()`方法用于设置弹窗中的“OK”按钮,并指定该按钮的点击事件监听器。可以根据需要添加其他按钮和相应的监听器。 3. 在另一个Activity的Java文件中,可以按照普通Activity的方式进行布局和功能实现。需要注意的是,由于该Activity将在弹窗显示,因此应尽量避免使用全屏布局或其他会导致显示问题的布局方式。 以上是在一个Activity中以弹窗形式显示一个Activity的基本步骤,可以根据实际需求进行相应的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值