本文均为Android常用知识点,搜集整理以供复习参考
Java知识点总结,请点我
1. 常用的布局有哪些?
FrameLayout,LinearLayout,RelativeLayout,AbsoluteLayout,GridLayout
CoordinatorLayout(协调),AppBarLayout,CollapsingToolbarLayout的一些相关属性
2. 内存泄漏的检测、几种常见场景及解决方法
场景一:静态变量持有了Activity
场景二:匿名内部类或非静态内部类引起的内存泄漏
场景三:Handler.sendMessageDelayed
场景四:Static Views
场景五:无限循环的属性动画
adb shelldumpsys meminfo (pid name)
查看activities数目
排查内存泄漏最简单和直观的方法
Android Studio-->monitor memory -->dump java head--> *.hprof
3. 使用TraceView来进行性能调优
Android Studio-->monitor --->CPU -->start method trace-->*.trace
Android 性能优化:使用 TraceView 找到卡顿的元凶
4. MVC/MVP/MVVM应用架构设计
如何构建Android MVVM应用程序(Databinding)
1 ViewModel与View的协作
2 ViewModel与Model的协作
3 ViewModel与ViewModel的协作
https://developer.android.com/topic/libraries/data-binding/index.html
5. SurfaceView TextureView View区别
SurfaceView与View的区别和使用场景
SurfaceView和TextureView区别分析
6. Android activity的生命周期
7. Activity&Fragment生命周期解析
8. Activity 定义启动模式
standard、singleTop、singleTask、singleInstance and FLAG_ACTIVITY_NEW_TASK
9. Android View重绘和更新: invalidate和requestLayout
10. 系统上安装了多种浏览器,能否指定某浏览器访问指定页面
Intent intent =newIntent();
intent.setAction("android.intent.action.VIEW");
Uri content_url =Uri.parse("http://www.163.com");
intent.setData(content_url);
//指定浏览器的包名类名
intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");
startActivity(intent);
11. ANR和Force close产生和原因
- ANR,程序没有响应,有可能程序会再次响应
例子:应用运行时,Main线程进行了耗时操作;应用运行时,用户操作过于频繁
Force close:程序抛出异常,应用停止运行,会强制退出
例子:应用运行时抛出了OutOfMemoryError,应用运行时抛出了RuntimeException - 可以通过Thread.UncaughtExceptionHandler捕获异常
12. Android 横竖屏切换(onSaveInstanceState()/onRestoreInstanceState())
- Android 3.2 (API 级别 13)以前
- 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。
- 设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。
- 设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。
- 从 Android 3.2 (API级别 13)开始
- 不设置Activity的android:configChanges,或设置Activity的android:configChanges="orientation",或设置Activity的android:configChanges="orientation|keyboardHidden",切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行一次。
- 配置 android:configChanges="orientation|keyboardHidden|screenSize",才不会销毁 activity,且只调用 onConfigurationChanged方法。
13. Android的系统架构
14. JVM、DVM(Dalvik VM)和ART虚拟机对比
http://blog.csdn.net/evan_man/article/details/52414390
15. [Android中AIDL的使用详解]
(http://www.jianshu.com/p/d1fac6ccee98)
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString);
16. Android进程间通信的几种方式
- Bundle/Intent传递数据
- Messenger是基于AIDL实现的,服务端(被动方)提供一个Service来处理客户端(主动方)连接,维护一个Handler来创建Messenger,在onBind时返回Messenger的binder。双方用Messenger来发送数据,用Handler来处理数据。示例
- AIDL通过定义服务端暴露的接口,以提供给客户端来调用示例
- ContentProvider底层也是Binder实现,主要用来为其他APP提供数据[Android 总结:ContentProvider 的使用]
- 在服务器中定义ServerSocket来监听端口,客户端使用Socket来请求端口,连通后就可以进行通信.
17. Android:Touch事件分发机制
- dispatchTouchEvent方法只负责事件的分发,当返回为true时,顺序下发会中断。
- 当某个View或者ViewGroup的onTouchEvent事件返回true时,便表示它是真正要处理这次请求的View,之后的Aciton_UP和Action_MOVE将由它处理。
- onInterceptTouchEvent有两个作用:1.拦截Down事件的分发。2.中止Up和Move事件向目标View传递,使得目标View所在的ViewGroup捕获Up和Move事件。
18. Activity布局加载流程
Activity的展示界面的特性是通过Window对象来控制的;
每个Activity对象都对应这个一个Window对象,并且Window对象的初始化在启动Activity的时候完成,在执行Activity的onCreate方法之前;
每个Window对象内部都存在一个FrameLayout类型的mDector对象,它是Acitivty界面的root view;
Activity中的window对象的实例是PhoneWindow对象,PhoneWindow对象中的几个成员变量mDector,mContentRoot,mContentParent都是View组件,它们的关系是:mDector –> mContentRoot –> mContentParent –> 自定义layoutView
LayoutInflater.inflate主要用于将布局文件加载到内存View组件中,也可以设定加载到某一个父组件中;
典型的Activity的onCreate方法中需要调用super.onCreate方法和setContentView方法,若不调用super.onCreate方法,执行启动该Activity的逻辑会报错,若不执行setContentView的方法,该Activity只会显示一个空页面。
其他相关流程:
19. LruCache缓存类
- LruCache,内部使用Map保存内存级别的缓存
- LruCache使用泛型可以设配各种类型
- LruCache使用了Lru算法保存数据(最短最少使用least recent use)
- LruCache只用使用put和get方法压入数据和取出数据
20. Android Context 是什么?
- Context类是一个抽象类,具体实现在ContextImpl类中;而ContextWrapper是Context的一个包装类(装饰器模式),其里面所有的方法实现都是调用其内部mBase变量的方法,而mBase就是ContextImpl对象
- ContextThemeWrapper中扩展了主题相关的方法。Application和Service是继承自ContextWrapper,而Activity是继承自ContextThemeWrapper(Activity在启动的时候系统都会加载一个主题)
21. Java开发中的23种设计模式详解
- Application 单例模式
- Broadcast 观察者模式
- Class.forName 工厂模式
- ContextWrapper 装饰器模式
- ListView 的Adapter 适配器模式
- new AlertDialog.Builder(this)属于(建造者)Builder模式
22. AsyncTask 详解
- 由于Handler需要和主线程交互,而Handler又是内置于AsyncTask中,所有AsyncTask的创建必须在主线程。
- AsyncTaskResult的doInBackground(Params)方法执行异步任务运行在子线程中,其他方法运行在主线程中,可以操作UI组件。
- 不要手动的去调用AsyncTask的onPreExecute, doInBackground, publishProgress, onProgressUpdate, onPostExecute方法,这些都是由android系统自动调用的。
- 一个AsyncTask任务只能被执行一次。
- 运行中可以随时调用cancel(boolean)方法取消任务,如果成功调用isCancel()会返回true,并不会执行onPostExecute(),取而代之的是调用onCancelled()。从源码看,如果这个任务已经执行了这个时候调用cancel是不会真正的把task结束,而是继续执行,只不过改变的是执行之后的回调方法的onPostExecute还是onCancelled.
23. 浅谈PopupWindow在Android开发中的使用
- 为什么setOutsideTouchable(false)点击外部区域还是会关闭窗口,需要重写setContentView(),重写setOutsideTouchable():
23. Android 反射机制的理解
Class<?> cls=Class.forName("test.Person");//加载Person类
Object object=(Object) cls.newInstance();//实例化Person
Method setname=cls.getDeclaredMethod("setName", String.class);//获取setName()方法
setname.invoke(object, "Lipt0n");//设置调用setName的对象和传入setName的值
Method getname=cls.getDeclaredMethod("getName");//获取getName方法
System.out.print(getname.invoke(object, null));//设置调用getName方法的对象.把值打印到控制台
- 应用无法接受广播,如果想通过广播调用未启动过的App,自Android3.1开始,需要加上
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
系统默认添加的是:
intent.addFlags(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES);
- 注册/取消注册应用内广播接收器
localBroadcastManager = LocalBroadcastManager.getInstance(context);
localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);
//取消注册应用内广播接收器
localBroadcastManager.unregisterReceiver(mBroadcastReceiver);
26. Android 动画总结
- 序列帧动画:关键词
animation-list
、AnimationDrawable
- 补间动画
- xml实现
Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.alpha_anim);
view.startAnimation(animation);
- Java Code 实现
animation = new RotateAnimation(-deValue, deValue, Animation.RELATIVE_TO_SELF,
pxValue, Animation.RELATIVE_TO_SELF, pyValue);
view.startAnimation(animation);
- 属性动画
ObjectAnimator anim = ObjectAnimator.ofFloat(myView, "rotation", 0f, 360f);
anim.setDuration(1000);
anim.start();
- ObjectAnimator 这个类,这个类继承自ValueAnimator
- 属性动画才是真正的实现了view的移动,补间动画对view的移动更像是在不同地方绘制了一个影子,实际的对象还是处于原来的地方
- 属性动画会导致Activity无法释放而导致内存泄漏,而补间动画却没有问题
27. ...
28. 图片加载框架
Universal-Image-Loader完全解析(一)--- 基本介绍及使用
Universal-Image-Loader完全解析(二)--- 图片缓存策略详解
Universal-Image-Loader完全解析(三)---源代码解读
29. H5 App开发 WeX5
30. 数据库安全
WCDB(https://github.com/Tencent/wcdb)是一个高效、完整、易用的移动数据库框架,基于SQLCipher,支持iOS, macOS和Android。
31. 曲线图 MPAndroidChart 教程
- MPAndroidChart 教程:概述
- MPAndroidChart 教程:开始 Getting Started(一)
- MPAndroidChart 教程:与图表进行手势交互 Interaction with the Chart(二)
- MPAndroidChart 教程:坐标轴,X轴,Y轴,Labels(三)
- MPAndroidChart 教程:设置数据,设置颜色(四)
- MPAndroidChart 教程:数据格式器 ValueFormatter(五)
- MPAndroidChart 教程:图表的具体设置 Specific chart settings(六)
- MPAndroidchart 教程:图例 Legend(七)
- MPAndroidChart 教程:动态和实时数据 Dynamic & Realtime Data(八)
- MPAndroidChart 教程:修改视窗 Modifying the Viewport(九)
- MPAndroidChart 教程:动画 Animations(十)
- MPAndroidChart 教程:MarkerView(十一)
- MPAndroidChart 教程:ChartData类,ChartData子类, DataSet类,DataSet子类(十二)
32. Android中的Apk的加固(加壳)原理解析和实现
参考文章