安卓开发---仿网易云小火箭dialog一个简单的自动更新弹窗以及下载apk
先看效果图 前面是网易云的小火箭更新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