Android知识点大全(一)

1、android缓存框架ASimpleCache
它是一个为android制定的 轻量级的 开源缓存框架。轻量到只有一个java文件(由十几个类精简而来)。它可以缓存普通的字符串、JsonObject、JsonArray、Bitmap、Drawable、序列化的java对象,和 byte数据。
http://blog.csdn.net/lianqiangjava/article/details/30267571


2、图片加载框架:universal-image-loader
http://blog.csdn.net/xiaanming/article/details/26810303
http://blog.csdn.net/vipzjyno1/article/details/23206387


3、Android 快速开发系列 ORMLite 框架最佳实践
操作数据库
http://blog.csdn.net/lmj623565791/article/details/39122981
http://blog.csdn.net/yunxiaoxiaoyun/article/details/16873669


4、监听可滚动View的滑动状态:Android-ObservableScrollView
可以向上滚动隐藏 Action Bar
监听滚动视图滚动事件的库,帮助与Toolbar的交互动效处理与Material Design的实现
http://www.jcodecraeer.com/a/opensource/2014/1118/2003.html
http://down.51cto.com/data/2049291
http://download.csdn.net/download/z63886148/8896045


5、改良的Android ViewPager小部件:InfiniteViewPager
InfiniteViewPager是一种改良的Android ViewPager小部件,允许无限的分页和自动滚动。
功能
    自动滑动到下一页
    平滑的滑到首页以及到尾页.
    View重用,不用担心内存泄露
    支持指示器(对ViewpagerIncicator做了一定修改)
    调用ViewPager.setCurrentItem()不卡顿, 比常用的解决方案好
http://www.open-open.com/lib/view/open1444014741666.html


6、ExRecyclerView - 可以设置头/底部,Item点击/长按监听的recyclerView
可以设置头/底部,Item点击/长按监听的recyclerView。可利用ExStaggeredGridLayoutManager给瀑布流设置头/底。利用DividerGridItemDecoration或DividerItemDecoration来添加分割线
可利用OnRecyclerViewScrollListener监听滑动到顶部、底部的事件,还可以监听滑动的距离
本项目中demo的adapter用的是通用的adapter(CommonRcvAdapter)来做的,如果你希望用recyclerView的adapter来做,你只需要将自己的adapter继承自BaseRecyclerAdapter即可。如果你希望了解下通用的adapter的构建模式,请参考:https://github.com/tianzhijiexian/CommonAdapter
http://www.open-open.com/lib/view/open1432708360176.html


7、Cygwin下载地址
链接: http://pan.baidu.com/s/1jGrm4xo 密码: eceg


8、NDK学习视频资料
http://pan.baidu.com/share/link?shareid=855291912&uk=2097227732
传智播客内部培训视频


9、屏幕适配

xml匹配方式:对应分辨率的手机的显示没有任何的效果时,必须要在androidmainfest中进行如下代码的配置:

<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true" />

如果没有这几行代码,不管你怎么调整layout中的控件,对应分辨率的手机是没有任何效果的。注意:由于android版本的不同,有些版本不支持xlargeScreens,可以直接将android:xlargeScreens="true"去掉。



10、设置隔五秒运行一下某程序

    Handler handler=new Handler();
    handler.post(runnable);
    
    
    Runnable runnable=new Runnable() {
    
        public void run() {
            Log.i(TAG, "runnable run");
            uploadFile(file);
            handler.postDelayed(runnable, 5000);
        }
    
    };

   

11、//给彩信中心返回成功接收信息
   NotifyRespInd notifyRespInd = new NotifyRespInd(
     PduHeaders.CURRENT_MMS_VERSION,
     TransactionId, PduHeaders.STATUS_RETRIEVED);
 
   mHttpBox = new HttpBox(MMSC, new PduComposer(context,notifyRespInd).make());
   
   mHttpBox.setConnectTimeout(50 * 1000);
   mHttpBox.setReadTimeout(30 * 1000);
   mHttpBox.setRequestMethod(true);

   mHttpBox.addHeader("User-Agent","Nokia6120c/4.21 (SymbianOS/9.2; U; Series60/3.1 Nokia6120c/4.21; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) Mozilla/5.0 AppleWebK");
   mHttpBox.addHeader("Accept","*/*, application/vnd.wap.mms-message, application/vnd.wap.sic");
   mHttpBox.addHeader("Content-Type","application/vnd.wap.mms-message");
   mHttpBox.addHeader("Accept-Charset","iso-8859-1, utf-8; q=0.7, *; q=0.7");
   mHttpBox.addHeader("Accept-Language","zh-cn, zh;q=1.0,en;q=0.5");

   mHttpBox.connect();

12、Android 6.0网络请求采用的是okHttp 替换原来的HttpClinton
    OKHttp知识:
    http://blog.csdn.net/lmj623565791/article/details/49734867
    http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0824/3355.html
   

13、 /**
     * 判断手机是否拥有Root权限。
     * @return 有root权限返回true,否则返回false。
     */  
    public boolean isRoot() {  
        boolean bool = false;  
        try {  
            bool = new File("/system/bin/su").exists() || new File("/system/xbin/su").exists();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return bool;  
    }  
    

14、onKeyDown的写法

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { //按下的如果是BACK,同时没有重复
      //do something here
        return true;
    }

    return super.onKeyDown(keyCode, event);
}


15、进度条

myDialog = ProgressDialog.show(this, "进度", "正在加载...",true);
            new Thread(){    
                        myDialog.dismiss();
                    }
       

16、map转String方法

public static String transMapToString(Map map){  
          java.util.Map.Entry entry;  
          StringBuffer sb = new StringBuffer();  
          for(Iterator iterator = map.entrySet().iterator(); iterator.hasNext();)  
          {  
            entry = (java.util.Map.Entry)iterator.next();  
              sb.append(entry.getKey().toString()).append( "=" ).append(null==entry.getValue()?"":  
              entry.getValue().toString()).append (iterator.hasNext() ? "," : "");  
          }  
          return sb.toString();  
        } 

17、连续点击两次程序就退出程序
   1、在Activity中设置一个long型的全局变量 firstTime=0,用来记录第一次按下的时间(单位为毫秒);
   2、响应Activity的 onKeyUp事件:
     
@Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            long secondTime = System.currentTimeMillis();
            if (secondTime - firstTime > 800) {//如果两次按键时间间隔大于800毫秒,则不退出
                Toast.makeText(MainActivity.this, "再按一次退出程序",
                        Toast.LENGTH_SHORT).show();
                firstTime = secondTime;//更新firstTime
                return true;
            } else {
                System.exit(0);//否则退出程序
            }
        }
        return super.onKeyUp(keyCode, event);
    }

18、//android2.3以上版本无法在主线程内连接网络之类的问题(android.os.NetworkOnMainThreadException)

if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                    .permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }

19、String 。。。age 和String [] age的区别
见代码:   
        public static void main(String[] args) {  
            callMe1(new String[] { "a", "b", "c" ,"d"});  
            callMe2("a", "b", "c" ,"d");  
            // You can also do this  
            // callMe2(new String[] {"a", "b", "c"});  
        }  
      
        public static void callMe1(String[] args) {  
            System.out.println(args.getClass() == String[].class);  
            for (String s : args) {  
                System.out.println(s);  
            }  
        }  
      
        public static void callMe2(String... args) {  
            System.out.println(args.getClass() == String[].class);  
            for (String s : args) {  
                System.out.println(s);  
            }  
        }
结果打印为:
true
a
b
c
d
true
a
b
c
d        
由此得出结论:方法一是传统的参数类型:字符串数组类型;
              方法二是可以传递一个或多个string类型的参数,不限制参数个数。

20、Android 布局中的MarginStart   MarginLeft 区别
    我们得知MarginStart指的是控件距离开头View部分的间距大小,MarginLeft则指的是控件距离左边View部分的间距大小,MarginEnd和MarginRight同理。


21、

             ADT - bundle版Eclipse
        
        链接: http://pan.baidu.com/s/1c0Qs2kg 密码: 14di


================================================我是孤独的分割线=======================================================




1、在Android library中不能使用switch-case语句访问资源ID。原因及解决方法:http://zmywly8866.github.io/2014/12/24/android-can-not-use-switch-to-load-resource-in-libproject-solution.html

2、不能在Activity没有完全显示时显示PopupWindow和Dialog。 原因及解决方法:http://stackoverflow.com/questions/4187673/problems-creating-a-popup-window-in-android-activity

3、在多进程之间不要用SharedPreferences共享数据,虽然可以(MODE_MULTI_PROCESS),但极不稳定。http://stackoverflow.com/questions/22129717/mode-multi-process-for-sharedpreferences-isnt-working

4、有些时候不能使用Application的Context,不然会报错(比如启动Activity,显示Dialog等)

5、一个应用的JNI代码,不要轻易换NDK编译的版本,否则会有很多问题(主要是一些方法实现不一样,并且高版本对代码的检测更严格),比如r8没有问题,但到r9就有问题了,这是个大坑;

6、Android的JNI代码中,有返回类型的函数没有返回值编译的时候也不会报错;

7、当前Activity的onPause方法执行结束后才会执行下一个Activity的onCreate方法,所以在onPause方法中不适合做耗时较长的工作,这会影响到页面之间的跳转效率;

8、谨慎使用Android的透明主题,透明主题会导致很多问题,比如:如果新的Activity采用了透明主题,那么当前Activity的onStop方法不会被调用;在设置为透明主题的Activity界面按Home键时,可能会导致刷屏不干净的问题;进入主题为透明主题的界面会有明显的延时感;

9、不要在非UI线程中初始化ViewStub,否则会返回null;

10、公共接口一定要考虑到代码重入的情况,能设计为单例就尽量用单例;

11、不要通过Bundle传递大块的数据,否则会报TransactionTooLargeException异常。http://stackoverflow.com/questions/12819617/issue-passing-large-data-to-second-activity

12、尽量不要通过Application缓存数据,这不稳定。http://zmywly8866.github.io/2014/12/26/android-do-not-store-data-in-the-application-object.html

13、尽量不要使用AnimationDrawable,它在初始化的时候就将所有图片加载到内存中,特别占内存,并且还不能释放,释放之后下次进入再次加载时会报错;

14、9图不能通过tinypng压缩,不然会有问题;

15、genymotion模拟器快是因为它是基于x86架构的,如果你的应用中用到了so,但没有x86架构的so,只能放弃使用它;Android Studio的模拟器也一样;

16、Eclipse的Android开发环境配置好后不要轻易升级ADT和build tools,不然会浪费你很多时间,还有就是一个workspace中的工程不要太多,不然每次启动都会很慢;

17、Android studio每个版本、gradle每个版本差别都比较大(我是这样认为的),对于jni代码的编译建议在Eclipse中进行,如果在Android studio中开发jni会浪费很多时间,主要是编译脚本的配置比较麻烦;

18、Eclipse中的Lint太不靠谱,特别是主工程中依赖library的时候,很多提示都是有问题的,建议使用Android Studio的工程清理工具,特别推荐;

19、不同API版本的AsyncTask实现不一样,有的是可以同时执行多个任务,有的API中只能同时执行一个线程,所以在程序中同时执行多个AsyncTask时有可能遇到一个AsyncTask的excute方法后很久都没有执行。调用AsyncTask的excute方法不能立即执行程序的原因分析及改善方案:http://zmywly8866.github.io/2015/09/29/android-call-asynctask-excute-not-run.html

20、同一个应用,相同的图片分别放在drawable-xxhdpi、drawable-xhdpi、drawable-hdpi、drawable-mdpi、drawable-ldpi中,在同一设备中占用的内存会大不一样(设备的dpi是固定的,图片放在不同的dpi文件夹下,在设备上显示时需要将图片转换成和当前屏幕一样dpi后在设备中显示,所以即使该图片在不同dpi文件夹下大小一样,但放在内存中的大小却不是一样的,并不一定是长*宽*4),做应用的内存优化之前可以先看一看你的工程是如何做屏幕适配的,是否有优化的空间。强烈推荐这个屏幕适配视频教程,花两个半小时就能看完:Android-屏幕适配全攻略https://link.zhihu.com/?target=http%3A//www.imooc.com/learn/484

21、谨慎对待数据库升级(比如需要在原数据库中增加字段),避免数据丢失或者操作数据库异常的情况,数据库升级方法可以查阅《第一行代码》P263;

22、多个程序共用一套代码(一套代码,在桌面上多个图标)时需要处理好不同入口进入时的堆栈问题;

23、使用Adapter的时候,如果你使用了ViewHolder做缓存,在getView的方法中无论这项的每个视图是否需要设置属性(比如TextView设置的属性可能为null,item的某一个按钮的背景为透明、某一项的颜色为透明等),都需要为每一项的所有视图设置属性(textview的属性为空也需要设置setText(""),背景透明也需要设置),否则在滑动的过程中会出现内容的显示错乱。

24、谨慎使用Android的多进程,多进程虽然能够降低主进程的内存压力,但会遇到如下问题:(1)不能实现完全退出所有Activity的功能(如果有同行在应用内采用多进程成功实现过完全退出程序欢迎沟通交流);(2)首次进入新启动进程的页面时会有延时的现象(有可能黑屏、白屏几秒,是白屏还是黑屏和新Activity的主题有关);(3)应用内多进程时,新启动一个进程都会重新跑一次Application的onCreate方法,不上重新创建一个Application,但会重新跑Application的onCreate,这样就不能在Application中缓存数据作为内存共享的途径了;(4)多进程间通过SharedPreferences共享数据时不稳定,具体可以查阅《Android开发艺术探索》

25、使用Toast时,建议定义一个全局的Toast对象,这样可以避免连续显示Toast时不能取消上一次Toast消息的情况(如果你有连续弹出Toast的情况,避免使用Toast.makeText)

26、View的面积越大绘制的时间就越长,透明通道对View的绘制速度影响很大

27、不要通过Msg传递大的对象,会导致内存问题

28、关于AS的使用经验,参见:[Android Studio使用过程中需要弄明白的一些问题]。http://zhuanlan.zhihu.com/zmywly8866/20375410

29、Eclipse的工程转成AS的版本后,在同一个机器中安装会报”INSTALL_FAILED_VERSION_DOWNGRADE“这个错误,原因是因为as除了可以在Manifest.xml文件中设置apk的版本名和版本号,还可以在build.gradle文件中设置apk的版本名和版本号,记得修改build.gralde中的版本名和版本号到最新就可以了;

30、通常情况下,在插入USB之后可能会跳转到一个新的界面,这时候可能你本来是横屏的,突然跳转到这个新界面是竖屏的,虽然你的界面被压在下面,但是还是会被强制横竖屏切换一次,如果这时候你的界面不做处理就会重载,如果你的界面里面有很多fragment,这时候的重载更加复杂,难以处理。所以建议不做横竖屏切换的界面都弄一下横竖屏切换不重载。方法:设置Activity的android:configChanges="orientation|keyboardHidden"

31、如果你在 manifest 中把一个 activity 设置成 android:windowSoftInputMode="adjustResize",那么 ScrollView(或者其它可伸缩的 ViewGroups)会缩小,从而为软键盘腾出空间。但是,如果你在 activity 的主题中设置了 android:windowFullscreen="true",那么 ScrollView 不会缩小。这是因为该属性强制 ScrollView 全屏显示。然而在主题中设置 android:fitsSystemWindows="false" 也会导致 adjustResize 不起作用;

32、做自定义手写功能时,底层上报的点并不会都在MotionEvent中能够及时接收到,比如底层一秒钟200个点,上层收到的可能只有几十个点,为了提高手写的流畅度,在onTouchEvent中,通过MotionEvent中的getHistorySize能够获取到从底层传输到上层过程中所有的点。

33、待续



猜你喜欢

转载自blog.csdn.net/chaozhung/article/details/50902048