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视图中修改
11、string.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
28、string.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、关于监听者模式
如果一个页面修改数据,会影响到其他页面,那么可以使用监听者模式。在需要监听的页面注册监听事件,修改数据的页面发送数据修改的消息,实现数据的同步刷新,而不用暴露页面内部的太多细节
43、LinkedHashMap
是HashMap的一个子类,它保留插入的顺序,如果需要输出的顺序和输入时的相同,那么就选用LinkedHashMap。定义了排序模式accessOrder,该属性为boolean型变量,对于访问顺序,为true;对于插入顺序,则为false。迭代顺序就是最后访问其条目的顺序,这种映射很适合构建LRU缓存
44、Android-Universal-Image-Loader源码分析
45、android studio 编译出错问题记录
(1)、报错"AAPT err(Facade for 1867654195): libpngerror: Not a PNG file"
原因可能是 UI给了你一个名叫.png的图,但它并不是png,eclipse不会检查这么仔细,所以不会提示错误。
解决办法:
在你的主工程文件夹里的build.gradle文件里,加上下面这两句:
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
46、Android studio与ADT不要使用同一份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); }});
48、sleep和wait的区别
sleep和wait有什么区别
49、Notification中点击事件启动页面的问题
主要问题是PendingIntent中的flag,有两种FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT
当使用FLAG_UPDATE_CURRENT时:
PendingIntent.getActivity(context, 0, notificationIntent,PendingIntent.FLAG_CANCEL_CURRENT时);
FLAG_UPDATE_CURRENT会更新之前PendingIntent的消息,比如,你推送了消息1,并在其中的Intent中putExtra了一个值“ABC”,在未点击该消息前,继续推送第二条消息,并在其中的Intent中putExtra了一个值“CBA”,好了,这时候,如果你单击消息1或者消息2,你会发现,他俩个的Intent中读取过来的信息都是“CBA”,就是说,第二个替换了第一个的内容
当使用FLAG_CANCEL_CURRENT时:
依然是上面的操作步骤,这时候会发现,点击消息1时,没反应,第二条可以点击。
导致上面两个问题的原因就在于第二个参数requestCode,当requestCode值一样时,后面的就会对之前的消息起作用,所以为了避免影响之前的消息,requestCode每次要设置不同的内容。
50、canvas执行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版本中使用,会导致上传失败。内部版本号要升一位。