最近有个需求, 应用的版本更新要在应用界面显示, 而不是让用户自己去应用市场查看有没有更新.
需求: 若是检查到有新版本, 则在首页弹出版本更新对话框, 若是该应用的渠道在手机上有安装, 则跳转到应用市场下载. 否则, 使用浏览器下载.
demo效果如下图:
对话框使用的是自定义的布局. 参考这里.
主要的逻辑如下:
1, 发起网络请求, 检查该版本是否有更新. 有更新则弹出对话框, 没有更新则不显示.
2, 检查该应用的发布渠道是否在手机上安装了该渠道的应用市场. (true/false)
3, true–>跳转到该应用市场的该应用的详情页下载.
4, false–>跳转到浏览器下载.
1,判断应用是否有更新, 这里就不写了.
2, 该应用使用友盟统计, 且发布到了好几个渠道的应用市场. 这里先获取该渠道是什么:
/**
* 友盟获取当前App所属渠道, 友盟sdk中的方法
* {@link #CHANNEL_KEY}
*
* */
@NonNull
public static String getChannel(@NonNull Context context) {
// 友盟会自动获取UMENG_CHANNEL字段
String channel = AnalyticsConfig.getChannel(context);
if (TextUtils.isEmpty(channel)) {
// 友盟出了问题自己尝试获取
channel = (String)readMetaDataFromApplication(context, CHANNEL_KEY);
if (TextUtils.isEmpty(channel)) {
// 自己获取不到渠道就使用默认渠道
channel = DEFAULT_CHANNEL;
}
}
return channel;
}
3, 通过应用的渠道名, 获取该应用市场的包名:
/**
* 获取应用市场的包名
*
* @param channel 渠道名
* @return 包名
*/
public String getAppStorePackageName(String channel) {
//根据渠道名获取应用市场的包名
if (channel.equals("给定的渠道")) {
return "当前渠道的包名";
}
//...其他的渠道的比对
//测试使用豌豆荚
return "com.wandoujia.phoenix2";
}
4, 知道了应用市场的包名后就可以知道手机上有没有安装该应用市场:
/**
* 检测某个应用是否安装
*
* @param packageName
* @return
*/
public boolean isAppInstalled(String packageName) {
try {
this.getPackageManager().getPackageInfo(packageName, 0);
return true;
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}
5, 应用市场安装, 跳转到该应用的详情页:
private void gotoAppInfoPage(String appStorePackageName) {
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("market://details?id=" + "com.tencent.mobileqq");//app包名,使用qq测试
intent.setData(uri);
intent.setPackage(appStorePackageName);
startActivity(intent);
}
6, 应用市场未安装, 跳转到浏览器:
private void gotoBrowserDownload() {
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url = Uri.parse("http://www.163.com");
intent.setData(content_url);
startActivity(intent);
}
7, 调用的代码:
private AlertDialog mDialog;
private void showUpdateDialog() {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
View view = View.inflate(this, R.layout.update_dialog, null);
((TextView) view.findViewById(R.id.title_tv)).setText("版本更新提示");
((TextView) view.findViewById(R.id.message_tv)).setText("版本更新内容:环境法咖啡机海鸥飞hi安徽覅节哀浩丰科技发哈及开发经费哈减肥哈欠案发后安静客服哈咖啡啊发顺丰");
view.findViewById(R.id.not_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDialog.dismiss();
}
});
view.findViewById(R.id.update_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取渠道名,使用友盟的方法
String channel = getChannel();
//获取该渠道的应用市场的包名
String appStorePackageName = getAppStorePackageName(channel);
if (isAppInstalled(appStorePackageName)) {
//跳转到应用市场的该版本的详情页
gotoAppInfoPage(appStorePackageName);
} else {
//应用未安装,浏览器下载新版本
gotoBrowserDownload();
}
}
});
mDialog = builder.setView(view).create();
mDialog.show();
}