Android的四大组件
四大组件的共同点是,要想使用,都要在AndroidManifest.xml里面进行注册。
1. Activity
Activity的生命周期
首先,Activity有七个表示不同阶段的回调函数。
onCreate onStart onResume onPause onStop onDestroy onRestart
下面这张图表示的是Activty完整的生命周期。
在pause和stop状态下Activity都有可能被回收
可以分为三个不同的生命周期。分别是:
- entire lifetime
onCreate->onStart->onResume->onPause->onStop->onDestroy - visible lifetime
此时Activity是可见的
onStart->onResume->onPause - foreground lifetime
此时可以Acticity是可见的,并且可以接受用户的交互
onResume->onPause
Activity的启动模式
通过在AndroidManifest.xml文件里面配置< activity >标签的android:LaunchMode属性来决定Activity的启动模式
standard
默认的启动模式。
每次要启动这个Activity的时候,不管当前的返回栈中是否已经有了这个Activity的实例,都会生成一个把这个Activity的一个新的实例入栈。
singleTop
当要启动的Activity有位于返回栈栈顶的实例的时候,不创建新的实例入栈;否则,创建一个新的实例并入栈。
singleTask
放要启动一个Activity的时候,首先查看整个返回栈中有没有这个Activity的实例,如果有的话(不管在不在栈顶),就把这个实例之前的其他实例出栈,使得这个实例移到栈顶,变成当前Activity;如果没有发现已有的实例,还是创建一个新的实例并入栈。
singleInstance
每个进程维护一个返回栈,表示这个进程启动过的Activity。当Activity是这个启动模式的时候,第一次启动这个Activity的时候这个Activity的实例不会入当前的返回栈,而是创建一个新的返回栈并入栈。
2. Service
Local Service —————-运行在主进程中
Remote Service————– 运行在单独的进程中
service的生命周期
Service的两种状态
started
A service is “started” when an application component (such as an activity) starts it by calling startService().
bound
A service is “bound” when an application component binds to it by calling bindService().
既被start又被绑定的service生命周期
只有Service, ContentProvider, Activity才能和Service进行bind,Broadcast Receiver不行。
要想实现和Service的交互,可以通过serviceConnection接口。
用一个类实现serviceConnection接口,重写onServiceConnected()方法和onServiceDisconnected方法。然后把这个类的实例作为参数传给bindService()方法;在Service那边要重写onBind()方法,返回一个继承自Binder类MyBinder的类的实例,这个实例会被传递给上面的onServiceConnected方法(如果onBind()返回null,则不会有回调),如果我们在这个MyBinder类中写了可以获得Service实例的public方法(MyBinder可以作为Service的内部类),现在就可以通过这个方法来获得Service实例,然后就可以和Service进行交互了。需要注意的是,调用unbind()是不会回调serviceConnection接口中的onDisConnected()函数的。只有在未预期的情况下(比如service突然被kill)才会调用
当Service被调用startService或者bindService的时候,如果服务是没有在内存中的,那么就会执行onCreate和onStartCommand,如果Service此时是活跃的,只会执行onStartCmmand。started和bound并不冲突。当一个Service既started又bound的时候,当所有绑定的组件都unbindService和调用了stopSelf()或者stopService两个条件都满足的时候才会被销毁。
Service的意义以及和Thread的区别
比如音乐播放,或者消息推送等,会用到Service。
Service和Thread是两个完全不同的概念。
除非特别指定,否则Service运行在当前进程的主线程里。Service是说想运行某些长时间的,不需要和用户交互的任务的时候用到。有服务的线程不容易被系统杀死。为了防止ANR,可以在服务中启动新的线程来执行任务。
3. Broadcast Receiver
4. Content Provider
ContentProvider和ContentResolver之间自动管理跨进程通信IPC
特定的查询方式避免了sql注入,
ListView的优化方法
getView方法
因为ListView每一个要绘制的item是用过与之绑定的adapt的getView方法返回的,所以中心思想是要尽量减少在getView方法中所做的事情。
复用getView(int position, view covertView, viewGroup parent)中的covertView,就可以避免每次都要inflate,很费时。省去从xml布局文件映射到内存中各个view的时间。
viewholder
使用一个viewHolder类,里面的属性是listView中的每个item中包含的view。当inflate的时候,使用setTag把赋好值的viewHolder给和item关联起来,当covertView不为null的时候,直接用getTag得到之前的viewHolder,省去findViewByView()的时间
异步加载图片
滑动的时候不去加载item
图片缓存
recycleView(android L)
ListView的替代类,性能更好。
数据持久化存储的几种方法
1. Shared Preference
2. SQLite
3. Content Provider
4. 文件系统
Android的布局有哪几种,分别有什么特点
多线程,以及Handler、Message、Looper的作用和原理
java中的多线程
view的重写
view.post()方法