Activity生命周期。
-
启动Activity: onCreate()—>onStart()—>onResume(),Activity进入运行状态。
-
Activity退居后台: 当前Activity转到新的Activity界面或按Home键回到主屏: onPause()—>onStop(),进入停滞状态。
-
Activity返回前台: onRestart()—>onStart()—>onResume(),再次回到运行状态。
-
Activity退居后台,且系统内存不足, 系统会杀死这个后台状态的Activity(此时这个Activity引用仍然处在任务栈中,只是这个时候引用指向的对象已经为null),若再次回到这个Activity,则会走onCreate()–>onStart()—>onResume()(将重新走一次Activity的初始化生命周期)
-
锁屏:
onPause()->onStop()
-
解锁:
onStart()->onResume()
通过Acitivty的xml标签来改变任务栈的默认行为
-
使用
android:launchMode="standard|singleInstance|singleTask|singleTop"
来控制Acivity任务栈。任务栈是一种后进先出的结构。位于栈顶的Activity处于焦点状态,当按下back按钮的时候,栈内的Activity会一个一个的出栈,并且调用其
onDestory()
方法。如果栈内没有Activity,那么系统就会回收这个栈,每个APP默认只有一个栈,以APP的包名来命名.- standard : 标准模式,每次启动Activity都会创建一个新的Activity实例,并且将其压入任务栈栈顶,而不管这个Activity是否已经存在。Activity的启动三回调(onCreate()->onStart()->onResume())都会执行。
- singleTop : 栈顶复用模式.这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,所以它的启动三回调就不会执行,同时Activity的
onNewIntent()
方法会被回调.如果Activity已经存在但是不在栈顶,那么作用与standard模式一样. - singleTask: 栈内复用模式.创建这样的Activity的时候,系统会先确认它所需任务栈已经创建,否则先创建任务栈.然后放入Activity,如果栈中已经有一个Activity实例,那么这个Activity就会被调到栈顶,
onNewIntent()
,并且singleTask会清理在当前Activity上面的所有Activity.(clear top) - singleInstance : 加强版的singleTask模式,这种模式的Activity只能单独位于一个任务栈内,由于栈内复用的特性,后续请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了
Activity的堆栈管理以ActivityRecord为单位,所有的ActivityRecord都放在一个List里面.可以认为一个ActivityRecord就是一个Activity栈
为什么在Service中创建子线程而不是Activity中
这是因为Activity很难对Thread进行控制,当Activity被销毁之后,就没有任何其它的办法可以再重新获取到之前创建的子线程的实例。而且在一个Activity中创建的子线程,另一个Activity无法对其进行操作。但是Service就不同了,所有的Activity都可以与Service进行关联,然后可以很方便地操作其中的方法,即使Activity被销毁了,之后只要重新与Service建立关联,就又能够获取到原有的Service中Binder的实例。因此,使用Service来处理后台任务,Activity就可以放心地finish,完全不需要担心无法对后台任务进行控制的情况。
Intent的使用方法,可以传递哪些数据类型。
通过查询Intent/Bundle的API文档,我们可以获知,Intent/Bundle支持传递基本类型的数据和基本类型的数组数据,以及String/CharSequence类型的数据和String/CharSequence类型的数组数据。而对于其它类型的数据貌似无能为力,其实不然,我们可以在Intent/Bundle的API中看到Intent/Bundle还可以传递Parcelable(包裹化,邮包)和Serializable(序列化)类型的数据,以及它们的数组/列表数据。
所以要让非基本类型和非String/CharSequence类型的数据通过Intent/Bundle来进行传输,我们就需要在数据类型中实现Parcelable接口或是Serializable接口。
http://blog.csdn.net/kkk0526/article/details/7214247
Fragment生命周期
注意和Activity的相比的区别,按照执行顺序
- onAttach(),onDetach()
- onCreateView(),onDestroyView()
Service的两种启动方法,有什么区别 1.在Context中通过public boolean bindService(Intent service,ServiceConnection conn,int flags)
方法来进行Service与Context的关联并启动,并且Service的生命周期依附于Context(不求同时同分同秒生!但求同时同分同秒屎!!)。
2.通过public ComponentName startService(Intent service)
方法去启动一个Service,此时Service的生命周期与启动它的Context无关。
3.要注意的是,whatever,都需要在xml里注册你的Service,就像这样:
<service
android:name=".packnameName.youServiceName"
android:enabled="true" />
广播(Broadcast Receiver)的两种动态注册和静态注册有什么区别。
- 静态注册:在AndroidManifest.xml文件中进行注册,当App退出后,Receiver仍然可以接收到广播并且进行相应的处理
- 动态注册:在代码中动态注册,当App退出后,也就没办法再接受广播了
ContentProvider使用方法
http://blog.csdn.net/juetion/article/details/17481039
目前能否保证service不被杀死
Service设置成START_STICKY
- kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样
提升service优先级
- 在AndroidManifest.xml文件中对于intent-filter可以通过
android:priority = "1000"
这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播。 - 【结论】目前看来,priority这个属性貌似只适用于broadcast,对于Service来说可能无效
提升service进程优先级
- Android中的进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程的回收
- 当service运行在低内存的环境时,将会kill掉一些存在的进程。因此进程的优先级将会很重要,可以在startForeground()使用startForeground()将service放到前台状态。这样在低内存时被kill的几率会低一些。
- 【结论】如果在极度极度低内存的压力下,该service还是会被kill掉,并且不一定会restart()
onDestroy方法里重启service
- service +broadcast 方式,就是当service走onDestory()的时候,发送一个自定义的广播,当收到广播的时候,重新启动service
- 也可以直接在onDestroy()里startService
- 【结论】当使用类似口口管家等第三方应用或是在setting里-应用-强制停止时,APP进程可能就直接被干掉了,onDestroy方法都进不来,所以还是无法保证
监听系统广播判断Service状态
- 通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活,别忘记加权限
- 【结论】这也能算是一种措施,不过感觉监听多了会导致Service很混乱,带来诸多不便
在JNI层,用C代码fork一个进程出来
- 这样产生的进程,会被系统认为是两个不同的进程.但是Android5.0之后可能不行
root之后放到system/app变成系统级应用
大招: 放一个像素在前台(手机QQ)
动画有哪两类,各有什么特点?三种动画的区别
-
tween 补间动画。通过指定View的初末状态和变化时间、方式,对View的内容完成一系列的图形变换来实现动画效果。 Alpha Scale Translate Rotate。
-
frame 帧动画 AnimationDrawable 控制 animation-list xml布局
-
PropertyAnimation 属性动画
-
Android的数据存储形式。
-
SQLite:SQLite是一个轻量级的数据库,支持基本的SQL语法,是常被采用的一种数据存储方式。 Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的api
-
SharedPreference: 除SQLite数据库外,另一种常用的数据存储方式,其本质就是一个xml文件,常用于存储较简单的参数设置。
-
File: 即常说的文件(I/O)存储方法,常用语存储大数量的数据,但是缺点是更新数据将是一件困难的事情。
-
ContentProvider: Android系统中能实现所有应用程序共享的一种数据存储方式,由于数据通常在各应用间的是互相私密的,所以此存储方式较少使用,但是其又是必不可少的一种存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储。每个Content Provider都会对外提供一个公共的URI(包装成Uri对象),如果应用程序有数据需要共享时,就需要使用Content Provider为这些数据定义一个URI,然后其他的应用程序就通过Content Provider传入这个URI来对数据进行操作。
Sqlite的基本操作。
http://blog.csdn.net/zgljl2012/article/details/44769043
如何判断应用被强杀
在Application中定义一个static常量,赋值为-1,在欢迎界面改为0,如果被强杀,application重新初始化,在父类Activity判断该常量的值。
Android怎么加速启动Activity。 分两种情况,启动应用 和 普通Activity 启动应用 :Application 的构造方法,onCreate 方法中不要进行耗时操作,数据预读取(例如 init 数据) 放在异步中操作 启动普通的Activity:A 启动B 时不要在 A 的 onPause 中执行耗时操作。因为 B 的 onResume 方法必须等待 A 的 onPause 执行完成后才能运行Android内存优化方法:ListView优化,及时关闭资源,图片缓存等等。
Android中弱引用与软引用的应用场景。
http://blog.csdn.net/jiankeufo/article/details/77966135
View与View Group分类。自定义View过程:onMeasure()、onLayout()、onDraw()。
如何自定义控件:
-
自定义属性的声明和获取
- 分析需要的自定义属性
- 在res/values/attrs.xml定义声明
- 在layout文件中进行使用
- 在View的构造方法中进行获取
-
测量onMeasure
-
布局onLayout(ViewGroup)
-
绘制onDraw
-
onTouchEvent
-
onInterceptTouchEvent(ViewGroup)
-
状态的恢复与保存
http://blog.csdn.net/jiankeufo/article/details/77966236
下拉刷新实现原理
http://blog.csdn.net/jiankeufo/article/details/77966772
你用过什么框架,是否看过源码,是否知道底层原理。
Retrofit
http://blog.csdn.net/jiankeufo/article/details/73186929
EventBus
http://blog.csdn.net/jiankeufo/article/details/52624060
glide
http://blog.csdn.net/jiankeufo/article/details/77894107
IntentService的使用场景与特点。
IntentService是Service的子类,是一个异步的,会自动停止的服务,很好解决了传统的Service中处理完耗时操作忘记停止并销毁Service的问题
优点:
- 一方面不需要自己去new Thread
- 另一方面不需要考虑在什么时候关闭该Service
onStartCommand中回调了onStart,onStart中通过mServiceHandler发送消息到该handler的handleMessage中去。最后handleMessage中回调onHandleIntent(intent)。
图片缓存
查看每个应用程序最高可用内存:
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
Log.d("TAG", "Max memory is " + maxMemory + "KB");
Gradle
构建工具、Groovy语法、Java
Jar包里面只有代码,aar里面不光有代码还包括代码还包括资源文件,比如 drawable 文件,xml 资源文件。对于一些不常变动的 Android Library,我们可以直接引用 aar,加快编译速度
你是如何自学Android
首先是看书和看视频敲代码,然后看大牛的博客,做一些项目,向github提交代码,觉得自己API掌握的不错之后,开始看进阶的书,以及看源码,看完源码学习到一些思想,开始自己造轮子,开始想代码的提升,比如设计模式,架构,重构等。