Android开发中遇到的坑

1、android手机上监听短信的两种方式

         (1) 接受系统的短信广播,操作短信内容。

         优点:操作方便,适合简单的短信应用。

         缺点:来信会在状态栏显示通知信息。

 

         实现:继承BroadcastReceiver类

 

         (2)  应用观察者模式,监听短信数据库,操作短信内容。

         优点:可以拦截来信在状态栏的显示通知,适合作短信拦截。

         缺点:可以发展成MU,在后台悄悄的收/发短信。

        

         实现:继承ContentObserver类,调用registerContentObserver注册监听类

 

2、动态加载类

  (1)DexClassLoader:可以加载jar/apk/dex,也可以从SD卡中加载

  (2)PathClassLoader:只能加载已经安装到android系统中的apk文件,或者dex文件

 

3、通过字符串获取资源id

  resources. getIdentifier(String name, StringdefType, String defPackage);

 

4、Intent启动service

  Intent启动service可以传入一个action的string,以此来启动service从而不需要调用定义好的service类

 

5、Looper. prepare ()以及Looper.loop()已经的使用

   如果要给一个非主线程发送消息,则需要建立该线程自己的消息队列。这个时候方才需要调用。

   如果是其他线程给主线程发送消息,则只需要持有主线程创建的Handler对象即可,或者通过Handler handler = new MyHandler(Looper.getMainLooper()); 来创建属于主线程的Handler,以此来给主线程发送消息。

   主要是看handler对象在哪个线程创建,主线程默认有创建消息队列,其他线程则需要自行创建。

 

6、程序按home键后再次启动会出现重启现象

         解决办法:启动页面不要设置为“singleTask”或者""singleInstance""

 

7、错误:You must call removeView() on the child's parent first.

写fragment的时候报出的错误,解决办法:

1.   public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  

2.      Log.i(TAG, "-- onCreateView(...) --");  

3.       mRootView = (View) inflater.inflate(R.layout.fragment_login, container, false);  

4.      return mRootView;  

5.   }  

6.    

7.   // FragmentActivity动态切换Fragment的时候,上面代码片段中的container设置为null或者其后的参数设置为false 

8、设置listView的分割线

http://blog.csdn.net/bdmh/article/details/39522071

1.   listView.setDivider(new ColorDrawable(Color.GRAY));  

2.  listView.setDividerHeight(1);  

9、RadioGroup 中添加RadioButton时,

如果想按照顺序给RadioButton编号,则需要调用RadioButton的setId,否则每个radiobutton的id都是不确定的

 

10、调试过程中修改值,在Variables视图中修改

 

11string.xml中使用%1$d

         %1$d:代表第一个参数是用整型替代,%1$s为字符串

1.    代码中使用%1$d时:String sAgeFormat = getResources().getString(R.string.old);  

2.  String sFinalAge = String.format(sAgeFormat, 23)

 

12、布局位置影响显示的层级

控件在xml文件中的位置会影响控件的布局层级,一般在xml底部的控件,显示出来的时候会在顶层,从而覆盖其他同位置的控件。

当所有控件添加完后,使用bringToFront方法可以调整叠放次序

 

13、Button触点太小

Button控件,如果大小是适配内容,有时候如果内容太小,会导致触点也很小,点击不灵敏。可以把Button换成ImageButton,设置src为原来的背景图,background设置为"@null"

,再设置padding。

 

14、string.xml里的警告Replace "..." with ellipsis character (…,&&;#8230;) ?

按照提示即可解决,提示的意思即为,用省略号的字符形式(…, &&;#8230;)?替换省略号"..."(这个省略号是由英文状态下输入的三个圆点),其中(…, &&;#8230;)?貌似是一个正则表达式(本人不太确定),解决方法有两个:

第一种方法:跳到中文输入法下,按shift+^打出省略号

第二种方法:直接将省略号替换为【

猜测原因:可能是在字符编码的情况下,省略号可以更好的显示吧

15、使用startActivityForResult时,onActivityResult无法执行的问题

原因:把启动模式singletask去掉

 

16、框架imageLoader的使用中报错

:UIL doesn'tsupport scheme(protocol) by default [pg]. You should implement this supportyourself (BaseImageDownloader.getStreamFromOtherSource(...))

原因:加载的路径为本地图片时应该在开头添加““file:///””

 

另外 使用ImageLoader加载res/drawable时务必将cacheOnDisk设为false. 

 

17、主线程的操作问题

  当主线程不得不进行耗时操作时,可以把事件拆分,用handle发送延时消息进行处理。

 

18、同目录下文件名和文件夹名相同的问题

    android系统是Linux内核的,所有的文件和文件夹都是文件,所以同目录下无法区分同名的文件和文件夹

                     File file =new File(bitName);

                     File pFile =file.getParentFile();

                     if(!pFile.exists()) {

                            pFile.mkdirs();

                     }

                     if(file.exists()&&file.isDirectory())

                     {

                            file.delete();

                            file.createNewFile();

                     }elseif(!file.exists())

                     {

                            file.createNewFile();

                     }

 

19、随机数 返回范围内的一个随机数

 int max=20;
        int min=10;
        Random random = new Random();

       int s = random.nextInt(max)%(max-min+1) + min;

 

20、arrlist中的数据修改问题

  ArrayList中的数据,如果有其他地方引用,会直接修改ArrayList中的数据,为保重数据使用的独立,请重新开辟空间

 

21、内存分析工具mat在eclipse上的插件mat: http://archive.eclipse.org/mat/1.1/update-site/

 

22、Activity.recreate:重新创建页面

 

23、界面的延时测绘:

    界面初次加载时,加延时绘制,等主界面绘制好,才能测出界面上控件的具体高度。这个思想可以推广到很多地方

24、友盟分享:

    1、 注意如果修改了微信平台的包名和签名,需要重装微信客户端后才可以测试,否则本地会保留之前的签名缓存,另外,微信不需要授权,微博如果安装了则需要授权

    2、微博授权失败的问题

这个问题是OAuth2.0 授权设置中授权回调页:地址的问题写成http://sns.whalecloud.com就好了

    3、微信分享时,text不能为空,否则分享失败

 

25、图片与文字控件ToggleButton

 

26、自定义Comparator中,返回1的是大的值放在前面

 

27、文件操作

   FileOutputStream使用的时候先要检测待操作的目录的父目录是否存在,不存在则需要创建,使用   mkdir

 

28string.split()的使用

    使用的是正则表达式,如果是转义字符,需要添加"\\",比如"\\."就是转义字符。而且,还可以使用"|"连接使用的多个分隔符

 

29、桌面图标显示不出来有可能是某个分辨率的文件夹下没有放logo图片导致的

 

30、

 

31、获取图片的信息类ExifInterface

 

32、条件断点

   在断点的地方右键选择“Breakpoint Properties",勾选“Conditional”,添加条件语句即可

 

33、Activity被回收导致fragment的getActivity为null的解决办法

    如果系统内存不足、或者切换横竖屏、或者app长时间在后台运行,Activity都可能会被系统回收,然后Fragment并不会随着Activity的回收而被回收,从而导致,Fragment丢失对应的Activity。

这里,假设我们继承于FragmentActivity的类为MainActivity,其中用到的Fragment为FragmentA。

    app发生的变化为:某种原因系统回收MainActivity——FragmentA被保存状态未被回收——再次点击app进入——首先加载的是未被回收的FragmentA的页面——由于MainActivity被回收,系统会重启MainActivity,FragmentA也会被再次加载——页面出现混乱,因为一层未回收的FragmentA覆盖在其上面——(假如FragmentA使用到了getActivity()方法)会报空指针,出现crash。

    原理虽然有点绕,但是解决办法很简单:

    MainActivity重写onSaveInstanceState方法,将super.onSaveInstanceState(outState);注释掉,让其不再保存Fragment的状态,达到其随着MainActivity一起被回收的效果!

 

34、设置Listview或者gridview的边距

    clipToPadding用来定义ViewGroup是否允许在padding中绘制。默认情况下,cliptopadding被设置为ture, 也就是把padding中的值都进行裁切了。

     所以设置clipToPadding为false,再去设置padding就可以使边距跟着列表一起滑动了

 

35、FastJson 使用要注意:

 默认的构造函数一定要写,不然是无法解析的。(对于fastjson严格按照JavaBean的规范来,有一点不对就无法解析,这里一定要切记,每一个实体类的属性的get , set 方法必须写,切方法第四个字母必须大写,

 

36、listview中item布局的高度无效时,可以设置minHeight可有效

 

37、设置输入模式

 android:windowSoftInputMode="adjustUnspecified|stateHidden"

如果以上没有效果,不如试试

getWindow().setSoftInputMode(

                            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

 

38、遇到服务器不支持的utf84字节编码,可以考虑用ba64加密一次

   比如emoji表情就是如此

import Android.util.Base64;

加密:

String 变量=android.util.Base64.encodeToString(字符串.getBytes(),Base64.DEFAULT);

解密:

byte b[]=android.util.Base64.decode(字符串,Base64.DEFAULT);

String 变量=new String(b);

另外,base64编码时注意:base64有很多个版本的变种形式,不同的平台注意使用同一种编码规则。base64标准的字符表是"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",有的版本就会为了避免其他方面的字符冲突,“+”“/”改成了“!”“-” “+/”改为“_-”“._”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“_:”。所以要注意要使用相同的规则,一般带有多变种版本的base64源码工具类会有类型选择的参数,仔细阅读源码或者文档。

 

39、扫描手机文件更新到多媒体管理

-   扫描全部我猜测其在效率方面可能有点副作用

1.   public void systemScan(){  

2.           sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"  

3.                   + Environment.getExternalStorageDirectory())));  

4.       }  

扫描某个文件 参数:填入该文件的路径

1.   public void fileScan(String file){  

2.           Uri data = Uri.parse("file://"+file);  

3.             

4.           sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, data));  

5.       }  

 

40、获取键盘的显隐状态

 调用系统的api InputMethodManager. isActive()亲测不太好用,必须换一个思路

activity根布局,监听其布局发生变化事件onGlobalLayout,比较当前布局的高度与根布局的高度差,如果大于一定的高度,说明键盘打开了,否则是隐藏了

参考链接:http://hunankeda110.iteye.com/blog/1856143

 

 

41、多线程中修改同一个值无效的时候,要看看两个线程是否在同一个进程,不同进程的堆栈空间不会共享的

 

42、关于监听者模式

如果一个页面修改数据,会影响到其他页面,那么可以使用监听者模式。在需要监听的页面注册监听事件,修改数据的页面发送数据修改的消息,实现数据的同步刷新,而不用暴露页面内部的太多细节

 

43LinkedHashMap

       HashMap的一个子类,它保留插入的顺序,如果需要输出的顺序和输入时的相同,那么就选用LinkedHashMap。定义了排序模式accessOrder,该属性为boolean型变量,对于访问顺序,为true;对于插入顺序,则为false。迭代顺序就是最后访问其条目的顺序,这种映射很适合构建LRU缓存

 

44Android-Universal-Image-Loader源码分析

Android-Universal-Image-Loader三大组件DisplayImageOptions、ImageLoader、ImageLoaderConfiguration详解

UNIVERSALIMAGE LOADER.PART 2---ImageLoaderConfiguration详解

UNIVERSALIMAGE LOADER. PART 3---ImageLoader详解

从代码分析Android-Universal-Image-Loader的图片加载、显示流程

从源代码分析Android-Universal-Image-Loader图片下载技巧

从源代码分析Android-Universal-Image-Loader的缓存处理机制

从源代码分析Universal-Image-Loader中的线程池

 

 

45、android studio 编译出错问题记录

(1)、报错"AAPT err(Facade for 1867654195): libpngerror: Not a PNG file"

原因可能是 UI给了你一个名叫.png的图,但它并不是pngeclipse不会检查这么仔细,所以不会提示错误。

解决办法:

在你的主工程文件夹里的build.gradle文件里,加上下面这两句:
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false

 

46Android studioADT不要使用同一份sdk,否则会有很多问题

比如这个错误:" Error:java.lang.UnsupportedClassVersionError:com/android/dx/command/Main: Unsupported major.minor version 52.0"换一个原来没有被Android Studio 使用过的sdk即可修复

tm烦,这个问题折腾了一个上午。网络上说的各种办法都没用

 

47、延时加载

相关文章:http://android.jobbole.com/82369/#article-comment

getWindow().getDecorView().post(new Runnable() {

    @Override

    public void run() {

        myHandler.post(mLoadingRunnable); }});

48sleepwait的区别

sleepwait有什么区别

 

49Notification中点击事件启动页面的问题

主要问题是PendingIntent中的flag,有两种FLAG_CANCEL_CURRENTFLAG_UPDATE_CURRENT

当使用FLAG_UPDATE_CURRENT时:

PendingIntent.getActivity(context, 0, notificationIntent,PendingIntent.FLAG_CANCEL_CURRENT);

FLAG_UPDATE_CURRENT会更新之前PendingIntent的消息,比如,你推送了消息1,并在其中的IntentputExtra了一个值“ABC”,在未点击该消息前,继续推送第二条消息,并在其中的IntentputExtra了一个值“CBA”,好了,这时候,如果你单击消息1或者消息2,你会发现,他俩个的Intent中读取过来的信息都是“CBA”,就是说,第二个替换了第一个的内容

 

当使用FLAG_CANCEL_CURRENT时:

依然是上面的操作步骤,这时候会发现,点击消息1时,没反应,第二条可以点击。

导致上面两个问题的原因就在于第二个参数requestCode,当requestCode值一样时,后面的就会对之前的消息起作用,所以为了避免影响之前的消息,requestCode每次要设置不同的内容。

 

 

50canvas执行drawPath画折线,在某些手机上画不出来的问题

    经研究是AndroidSDK(4.1)下的bug,有两种解决方案:(1)manifest文件中禁止硬件加速,损失比较大 (2)在自定义控件的构造函数中执行this.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

 

51、发布版本的时候,versionCode要大于之前的版本,否则有些渠道网站无法上传!

 

52、在一些局部的小逻辑上,不要轻易使用while(true)这种循环逻辑,及其容易出现死循环

 

53、在google play 上发布alpha版本之后,alpha版本使用的内部版本号不能在新的release版本中使用,会导致上传失败。内部版本号要升一位。

你可能感兴趣的:(我在Android开发)