Android 常见问题
1. 每次调用 getInstallParam 方法都会回调,会触发业务重复调用,怎么办?
SDK内部将会一直保存安装数据,每次调用 getInstallParam 方法都会返回值,如果调用了 getInstallParam 并处理了自己的业务,后续不想再被触发,那么可以自己在业务调用成功时,设置一个标识,不再调用 getInstallParam 方法。
final SharedPreferences sp = getSharedPreferences("filename", MODE_PRIVATE);
boolean isFirst = sp.getBoolean("isFirst", true);
if (isFirst) {
XInstall.getInstallParam(new XInstallListener() {
@Override
public void onInstallFinish(XAppData data, XAppError error) {
//使用数据后,不想再调用,将isFirst设置为false
sp.edit().putBoolean("isFirst", false).apply();
}
});
}
2. App有多个进程时,多次调用 XInstall.init,导致安装参数获取不到?
当App存在多个进程,并且 XInstall 是在Application的onCreate方法中初始化时,会因为多次调用Application的onCreate方法,导致 XInstall 初始化方法触发多次,从而导致安装参数获取不到。 使用以下代码判断当前进程是否是应用的主进程,然后只在主进程中调用 XInstall.init 方法
public boolean isMainProcess(){
int pid = android.os.Process.myPid();
ActivityManager activityManager = (ActivityManager)
getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo appProcess : activityManager.getRunningAppProcesses()) {
if (appProcess.pid == pid) {
return getApplicationInfo().packageName.equals(appProcess.processName);
}
}
return false;
}
3. 应用在后台时,通过网页拉起应用无法正常获取到参数
检查对应activity的onNewIntent生命周期方法内是否添加了唤醒参数获取方法。如果未添加,会导致应用存在后台时,网页拉起应用后无法正常获取到唤醒参数 (Android在app未在后台的情况下,网页直接唤醒打开后,唤醒Activity被杀掉后,应用退回到后台,进入浏览器后不刷新,网页再次点击按钮尝试唤醒,部分浏览器会出现仅将app从后台切换到前台,并不会再次唤醒对应Activity,而且该情况下,切换到前台时的Activity中未能在各个生命周期中获取到唤醒的intent信息。 经过验证,该现象为浏览器的机制,和是否使用 XInstall sdk无关。 【测试:当app仅为一个Activity构成时,即MainActivity为唤醒Activity,按照上述流程不杀掉Activity的情况下切换到后台,再次唤醒,不会触发onCreat、onNewIntent生命周期,但是会触发onResume生命周期,此时可以获取到唤醒的intent信息】 存在上述现象的浏览器:华为系统浏览器、QQ浏览器、uc浏览器、欧朋浏览器、搜狗浏览器等 每次都会重新唤醒scheme标签对应的activity的浏览器:小米系统浏览器、google浏览器、三星浏览器、360浏览器等)
4. 如何在代码混淆时忽略 XInstall sdk?
在proguard文件中添加配置:
-dontwarn com.shubao.xinstall.**
-keep class com.shubao.xinstall.** {*;}
-dontwarn com.xinstall.**
-keep class com.xinstall.** {*;}
5. 如何提高android用户的下载体验和匹配精度?
尽量选择安装包托管在 XInstall 平台下载,这样对下载体验和参数获取精度会有很大帮助。
6. 网页尝试唤醒已经安装好的app时,会先出现是否打开app的提示,然后下载任务又会弹出,挡住打开app的提示窗口
该问题是由于在点击按钮触发wakeupinstall方法时,js会先尝试执行唤醒操作,然后执行延时下载操作。但因为js无法判断对应的app是否已安装,就会出现唤醒后面的下载会继续执行,从而出现打开app的提示后又出现下载任务提示。
7. Android下载设置中不同下载方式的区别
(1)托管APK:下载上传到XInstall控制台的apk包,可以自行选择对应的安装包文件。 (2)外部APK:可以填写apk安装包下载地址、下载页面(包含第三方平台的地址)。
8. Android SDK导入常见问题
8.1 build.gradle配置问题
默认Android侧边栏管理中模式中是看不到lib目录的,导入项目时候需要左上角切换到project模式,在src文件夹下找到build.gradle进行配置,如下图
8.2 minSdkVersion支持问题
Xinstall要求最低的兼容的版本minSdkVersion是19,如果如下提示
说明是SDK版本设置过低。直接修改build.gradle中配置minSdkVersion 19即可。如下图
8.3 集成后编译无法通过问题
这是因为代码还没有链接的关系,重启开发工具Androidstudio或重新加载即可
9. 一键拉起/唤起App失败
90%以上的唤起失败问题,可以通过下面方式排查快速解决
在集成SDK以后,原来手机上的App需要重新卸载后再次安装才能唤起成功
是否是模拟器,暂不支持模拟器一键拉起,请用真机测试
SDK是否集成成功,可以先在Android-集成-上传安装包底部选择测试,用Xinstall页面进行测试,如果这个页面也不能跳转,说明安卓SDK没有对接成功。如果能跳转,而自己页面不能跳转,说明自己页面的Web SDK集成不对,需要排查下。主要是scheme配置正确
浏览器首次拒绝导致无法跳转。部分浏览器,如果你在首次跳转时候选择了取消,那么下次点击唤起时候,浏览器将默认不再提示跳转。可以尝试恢复出厂设置,和清楚缓存来解决这个问题。如Via,小米手机自带浏览器,夸克浏览器
浏览器本身不允许跳转,如百度浏览器。
QQ/微信中限制,需要满足上架条件,微信需要上架应用宝,QQ需要上架应用包或本地应用市场,如华为手机就需要上架华为市场。见下图
10. 已经下载应用但还是提示去下载
由于浏览器权限限制,网页是无法判断手机是否已经安装了目标应用。为了保障首次下载客户能正常下载安装,正常需要每次点击安装后都需要提示安装
Xinstall通过体验优化,目前已经可以做到90%以上浏览器在手机已经下载时,不再提示下载,而是直接进行唤起。
但还是有少部分机型没法做到完全的适配,我们会首先尝试唤起应用,然后在一定时间间隔后提示下载
还有一种情况,是测试机在多次下载安装过程中,如果曾经在提示唤起时候选择过拒绝/取消跳转,这会导致之后部分浏览器不再给出唤起弹窗,如果这个情况,您可以尝试恢复浏览器出厂设置和清楚缓存来解决
11. 为什么安卓微信扫码以后没有去下载我的应用,而是去下载应用宝了?
这个是因为微信App限制的问题。微信在8月中旬对扫码下载(包括已经上架应用宝的)App进行了更新,任何下载需要先下载应用宝,需要先下载应用宝,然后会自动开始下载客户App。 如果App没上架应用宝Xinstall将会在微信内弹窗在浏览器打开选项。
12. 在接入安卓中,很多同学会问,当Launcher 的Acrtivity 的LaunchMode 设置为 "singleTask", 如何让这个Activity 只在冷启动的时候显示,热启动的时候不显示?
val flags = intent.getFlags();
val flags2 = Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT
if (flags.and(flags2) == 0) {
setContentView(R.layout.activity_welcome)
welcome.postDelayed({
WakeUpActivity.start(this)
finish()
},1500)
} else {
// 非第一次 会直接finish
finish()
}