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

来源:互联网 发布:华为软件培训 编辑:程序博客网 时间:2024/05/20 04:11

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



先说思路吧,想实现自动更新版本,最简单就是获取到应用的包信息,应用版本号,版本名,然后每次登陆的时候从服务器获取当前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 

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

有一点需要注意,获取的版本号是build.gradle里的

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 字段

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

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


小火箭的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);

使用很简单: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


阅读全文
1 0