Android遇到的坑小结

来源:互联网 发布:淘宝数据包解压工具 编辑:程序博客网 时间:2024/05/29 15:40

> 如果知道使用executeOnExecutor方法,自己定义线程池就不会出现Task任务没有立即执行的情况

http://zmywly8866.github.io/2015/09/29/android-call-asynctask-excute-not-run.html

> Android 开发中,有哪些坑需要注意?http://www.zhihu.com/question/27818921#answer-23532423
> 在Android开发的过程中,有哪些坑是值得你放在checklist中警示自己的?:http://www.zhihu.com/question/27488517

> Android填坑系列:在小米系列等机型上放开定位权限后的定位请求弹框 :http://www.cnblogs.com/lwbqqyumidi/p/5466909.html

解决过程:
1.Flurry的小坑
项目中引入了数个第三方SDK,主要包括Flurry,友盟,个推,百度定位SDK等。在App启动初始化及进入到首页的执行流中,主要涉及到Flurry,友盟,个推。
且通过对项目中所有引入第三方SDK JAR包中逐一搜索LocationManager,发现仅有Flurry和百度定位中含有。于是,初步定位到Flurry。去掉Flurry后,发现在此类机型上一进入app就出现定位请求弹框现场确实消失。
在Flurry官方文档上终于找到相应的开关接口:FlurryAgent.setReportLocation(boolean);此方法直接决定了Flurry是否上报用户地址位置信息,且其默认值为true。
于是,在对Flurry进行init后,直接调用FlurryAgent.setReportLocation(false); 再次测试,上述必现问题解决。

2.友盟的善良
本以为问题至此已经结束,不想在随后的使用过程中,在小米系列等机型上会不定期出现位置请求弹出框,且经过仔细核验,此时也并未触发app内自身的定位请求,且主要问题是:不定期出现,太诡异了!
网上查阅了一些资料,没有较好头绪。不过上面的Flurry解决过程给了一些思路,既然Flurry在有定位权限的情况下默认会获取地理位置信息,那么其他SDK会不会也类似呢?抱着好奇心态,看了下友盟的class文件,
发现了其中有一个方法setAutoLocation(boolean),哈,这不是跟Flurry如出一辙嘛。但是,发现一个奇怪的现象,友盟中setAutoLocation方法已经废弃。
  public class MobclickAgent {
      private static final String a = "input map is null";
      private static final d b = new d();
    public MobclickAgent() {
      
      }
      /** @deprecated */
     public static void setAutoLocation(boolean var0) {
     
     }  
     ...   
 }
 已经废弃,且变成了一个空方法,那会不会就是友盟的霸道,在偷偷获取地理位置信息的时候甚至不给app提供开关接口呢?此开关方法已经废弃,必有原因,终于找到了老版的此方法没有废弃的友盟SDK,比较下class文件,发现老版的友盟SDK中存在LocationManager方法,但新版已经没有了。且友盟论坛上也有人说到了此问题,且去掉友盟后,大量测试后发现此问题确实存在,看样子友盟还是很善良的,直接去掉了获取用户定位信息,所以此开关方法当然废弃了。
值得赞一个。

3.百度定位的疑惑, 百度定位SDK文档中要求具有定位权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
实际上,具有ACCESS_FINE_LOCATION权限也就具有了ACCESS_COARSE_LOCATION权限。大量测试结果表明,当手机上GPS开启时,定位弹出框出现概率较大,且百度定位是采用混合定位方式,项目中的实际需求无需精确定位,
粗略定位已经可以满足需求,那么会不会跟权限有些关系,于是将ACCESS_FINE_LOCATION改成ACCESS_COARSE_LOCATION,且通过与其他app反解后横向对比,发现其他使用百度定位的app也只是使用了粗略定位权限,果断改之。
改后发现定位弹框不定期出现概率果然降低。
     百度定位配置中还有如下Service配置
 <!--百度定位服务-->
 <service
     android:name="com.baidu.location.f"
     android:enabled="true"
     android:process=":remote" >
 </service>
实际测试中,发现如果权限是ACCESS_FINE_LOCATION,此处Service配置上加上android:exported="false"也一定程度上使得定位弹框出现概率降低,
此处果断加上。
 <!--百度定位服务-->
 <service
     android:name="com.baidu.location.f"
     android:enabled="true"
     android:exported="false"
     android:process=":remote" >
 </service>

4.个推的坑货
上述修改后,不定期出现位置请求弹框概率相对已经较小。在长时间使用中偶有一次。那这定位请求到底是谁触发的呢?大量测试下,发现当修改系统时间后,此问题变成必现。
既然找到了一个蹊跷的必现路径,就好定位了许多。果断去掉百度定位,友盟及Flurry。但保留定位权限,此问题在上述必现路径下依然必现。
去掉个推初始化等相关,此问题在上述必现路径下果断消失。发现就你了,个推!!本以为有些善良的你应该和Flurry及老版本的友盟一样,提供开关接口,但失望了!
联系个推所谓的技术支持,对方肯定了个推在有定位权限情况先获取位置信息的同时,但针对开关接口问题回答潇洒!但这确实影响到了用户体验!!

 > TextView(往往 TextView 派生子类同样适用)调用 setText 方法设置一个 int 型的数据,千万要将该值转为 String,否则在某些设备中它会默认去查询 R 文件中定义的资源。
  android:process属性。比如你的 App 运行在 com.codingfish.test 进程,需要产生分享动作的Activity 设置 android:proces=":com.codingfish.hello" ,那么新浪微博就会出现你设置的分享内容没有显示的问题。该 Bug 已经提交给友盟的技术人员,但是 N 久没有得到修复。

0 0
原创粉丝点击