安卓开发---仿网易云小火箭dialog一个简单的自动更新弹窗以及下载apk

先看效果图 前面是网易云的小火箭更新dialog

安卓开发---仿网易云小火箭dialog一个简单的自动更新弹窗以及下载apk

安卓开发---仿网易云小火箭dialog一个简单的自动更新弹窗以及下载apk安卓开发---仿网易云小火箭dialog一个简单的自动更新弹窗以及下载apk安卓开发---仿网易云小火箭dialog一个简单的自动更新弹窗以及下载apk

先说思路吧,想实现自动更新版本,最简单就是获取到应用的包信息,应用版本号,版本名,然后每次登陆的时候从服务器获取当前apk的版本号和版本名,然后进行判断,不一致证明是新版本,弹出dialog 让用户更新,选择立即更新调用浏览器下载(系统自带的),然后就是安装了...balabala

步骤 1,获取包信息,版本号,版本名

/**
 * 返回当前程序版本名  build.gradle
 */
public  String getAppVersionName(Context context) {
    try {
        // ---get the package info---
        PackageManager pm = context.getPackageManager();
        PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
        versionName = pi.versionName;
        versioncode = pi.versionCode;
        LogUtil.d("versionName:---"+versionName,"versioncode:---"+versioncode);
        if (versionName == null || versionName.length() <= 0) {
            return "";
        }
    } catch (Exception e) {
        Log.e("VersionInfo", "Exception", e);
    }
    return versionName;
}
打印的log 安卓开发---仿网易云小火箭dialog一个简单的自动更新弹窗以及下载apk

05-18 09:03:17.200 31512-31512/com.hxzh.uniwill.lingjian D/versionName:---1.0.5: versioncode:---5

有一点需要注意,获取的版本号是build.gradle里的安卓开发---仿网易云小火箭dialog一个简单的自动更新弹窗以及下载apk

2.通过上面的方法获取到版本名(也就是1.0.5)之后联网获取服务器存的版本名

private String oldVersion,NewVersion,versionmsg,url;
private TextView tvmsg,tvcode;

oldVersion =  getAppVersionName(Activity_login.this);

OkHttpUtils.get(Http_Api.URL_UpdataVersion)
        .params("ostype","1")
        .execute(new StringCallback() {
            @Override
            public void onSuccess(String s, Call call, Response response) {

                updataVserion = JsonUtil.parseJsonToBean(s,Data_updataVserion.class);
                NewVersion = updataVserion.getVersion();
                versionmsg = updataVserion.getMess();
                url = updataVserion.getAddress();
                String[] n = versionmsg.split("n");
                versionmsg = n[0]+"\n"+n[1]+"\n"+n[2];
                if (!NewVersion.equals(oldVersion)){
                    updataDialog.show();
                    tvmsg = (TextView) updataDialog.findViewById(R.id.updataversion_msg);
                    tvcode = (TextView) updataDialog.findViewById(R.id.updataversioncode);
                    tvcode.setText(NewVersion);
                    tvmsg.setText(versionmsg);
                    updataDialog.setOnCenterItemClickListener(new UpdataDialog.OnCenterItemClickListener() {
                        @Override
                        public void OnCenterItemClick(UpdataDialog dialog, View view) {
                            switch (view.getId()){
                                case R.id.dialog_sure:
                                    Intent intent= new Intent();
                                    intent.setAction("android.intent.action.VIEW");
                                    Uri content_url = Uri.parse(url);
                                    intent.setData(content_url);
                                    startActivity(intent);
                                    break;
                            }
                        }
                    });

                }
            }
        });
我这里服务器返回的json 字段

安卓开发---仿网易云小火箭dialog一个简单的自动更新弹窗以及下载apk content : {"address":"http://123.56.97.229/pdownload/LingJian.apk","mess":"1.加入了自动更新功能,可以点击按钮下载最新apk-2.修复了一些bug-3.不用扫描下载了","version":"1.0.6"}

3.其实就是每次有新版本就让服务器修改字段就好了,原理非常简单,我获取到json字段进行判断,不一致就提示更新,然后调用系统自带浏览器下载apk

Intent intent= new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url = Uri.parse(url);
intent.setData(content_url);
startActivity(intent);

dialog大家可以自己随便定义,我是看网易云的小火箭太好看了,于是求美工,哦不是,是设计师姐姐帮我做了个背景

在这里贴上图片素材和代码吧

安卓开发---仿网易云小火箭dialog一个简单的自动更新弹窗以及下载apk

小火箭的png图片就是dialog的背景

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/roctet_bg"
    android:gravity="center_horizontal"
    android:orientation="vertical">

    <TextView
        android:id="@+id/updataversion_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="180dp"
        android:text="@string/updataversion"
        android:textColor="@color/black"
        android:textSize="25sp"/>
    <TextView
        android:id="@+id/updataversioncode"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/updatacode"
        android:textColor="@color/black"
        android:textSize="16sp"
        android:layout_marginBottom="20dp"/>
    <TextView
        android:id="@+id/updataversion_msg"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:text="@string/updatamsg"
        android:textColor="@color/black_hehe"
        android:textSize="15sp" />

    <!--<View-->
        <!--android:layout_width="match_parent"-->
        <!--android:layout_height="1dp"-->
        <!--android:background="#cecece" />-->

    <LinearLayout
        android:id="@+id/dialog_sure"
        android:clickable="true"
        android:layout_marginTop="10dp"
        android:layout_width="250dp"
        android:layout_height="50dp"
        android:orientation="horizontal"
        android:background="@drawable/updataversionbut_bg">

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="@string/updatasuer"
            android:textColor="@color/white"
            android:textSize="22sp" />

        <!--<View-->
            <!--android:layout_width="1dp"-->
            <!--android:layout_height="match_parent"-->
            <!--android:background="#cecece" />-->

        <!--<TextView-->
            <!--android:id="@+id/dialog_cancel"-->
            <!--android:layout_width="0dp"-->
            <!--android:layout_height="match_parent"-->
            <!--android:layout_weight="1"-->
            <!--android:gravity="center"-->
            <!--android:background="@color/updataversionbut"-->
            <!--android:text="@string/updatano"-->
            <!--android:textColor="@color/white"-->
            <!--android:textSize="20sp" />-->
    </LinearLayout>

</LinearLayout>
dialog代码

package com.hxzh.uniwill.lingjian.View;


import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

import com.hxzh.uniwill.lingjian.R;

/**
 * @author   庞世宇
 * @describe 自定义居中弹出dialog
 */
public class UpdataDialog extends Dialog implements View.OnClickListener {

    private Context context;

    private int layoutResID;

    /**
     * 要监听的控件id
     */
    private int[] listenedItems;

    private OnCenterItemClickListener listener;

    public UpdataDialog(Context context, int layoutResID, int[] listenedItems) {
        super(context, R.style.MyDialog);
        this.context = context;
        this.layoutResID = layoutResID;
        this.listenedItems = listenedItems;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Window window = getWindow();
        window.setGravity(Gravity.CENTER); // 此处可以设置dialog显示的位置为居中
        window.setWindowAnimations(R.style.bottom_menu_animation); // 添加动画效果
        setContentView(layoutResID);
        // 宽度全屏
        WindowManager windowManager = ((Activity) context).getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.width = display.getWidth()*4/5; // 设置dialog宽度为屏幕的4/5
        getWindow().setAttributes(lp);
        // 点击Dialog外部消失
        setCanceledOnTouchOutside(true);

        for (int id : listenedItems) {
            findViewById(id).setOnClickListener(this);
        }
    }

    public interface OnCenterItemClickListener {

        void OnCenterItemClick(UpdataDialog dialog, View view);

    }

    public void setOnCenterItemClickListener(OnCenterItemClickListener listener) {
        this.listener = listener;
    }

    @Override
    public void onClick(View view) {
        dismiss();
        listener.OnCenterItemClick(this, view);
    }
}

修改提示文本信息,升级了哪些功能啥的

tvmsg = (TextView) updataDialog.findViewById(R.id.updataversion_msg);
tvcode = (TextView) updataDialog.findViewById(R.id.updataversioncode);
tvmsg.setText(versionmsg);
安卓开发---仿网易云小火箭dialog一个简单的自动更新弹窗以及下载apk

使用很简单:new对象,里面是布局和点击事件的id

updataDialog = new UpdataDialog(Activity_login.this,R.layout.dialog_updataversion,
        new int[]{R.id.dialog_sure});
<style name="MyDialog" parent="android:style/Theme.Dialog">
    <!--背景颜色及和透明程度-->
    <item name="android:windowBackground">@android:color/transparent</item>
    <!--是否去除标题 -->
    <item name="android:windowNoTitle">true</item>
    <!--是否去除边框-->
    <item name="android:windowFrame">@null</item>
    <!--是否浮现在activity之上-->
    <item name="android:windowIsFloating">true</item>
    <!--是否模糊-->
    <item name="android:backgroundDimEnabled">false</item>
    <!--是否半透明-->
    <item name="android:windowIsTranslucent">true</item>

    <item name="android:background">#00000000</item>
</style>
<!-- dialog底部弹出菜单动画 -->
<style name="bottom_menu_animation" parent="android:Animation">
    <item name="@android:windowEnterAnimation">@anim/bottom_menu_enter</item>
    <item name="@android:windowExitAnimation">@anim/bottom_menu_exit</item>
</style>
这是动画样式


最后,希望可以对大家有些帮助,感谢阅读

下载地址 https://github.com/PangHaHa12138/RocketUpdata