一.Android中高级面试题
1、Activity生命周期?
onCreate()
-> onStart()
-> onResume()
-> onPause()
-> onStop()
-> onDetroy()
2、Service生命周期?
service 启动方式有两种,一种是通过startService()
方式进行启动,另一种是通过bindService()
方式进行启动。不同的启动方式他们的生命周期是不一样.
通过startService()
这种方式启动的service,生命周期是这样:调用startService()
--> onCreate()
–> onStartConmon()
–> onDestroy()
。这种方式启动的话,需要注意一下几个问题,
第一:当我们通过startService
被调用以后,多次在调用startService()
,onCreate()
方法也只会被调用一次,而onStartConmon()
会被多次调用当我们调用stopService()
的时候,onDestroy()
就会被调用,从而销毁服务。
第二:当我们通过startService
启动时候,通过intent传值,在onStartConmon()
方法中获取值的时候,一定要先判断intent是否为null。
通过bindService()
方式进行绑定,这种方式绑定service,生命周期走法:bindService
–>onCreate()
–>onBind()
–>unBind()
–>onDestroy()
bingservice
这种方式进行启动service好处是更加便利activity中操作service,比如加入service中有几个方法,a,b ,如果要在activity中调用,在需要在activity获取ServiceConnection
对象,通过ServiceConnection
来获取service中内部类的类对象,然后通过这个类对象就可以调用类中的方法,当然这个类需要继承Binder对象
3、Activity的启动过程(不要回答生命周期)
app启动的过程有两种情况,第一种是从桌面launcher上点击相应的应用图标,第二种是在activity中通过调用startActivity
来启动一个新的activity。
我们创建一个新的项目,默认的根activity都是MainActivity
,而所有的activity都是保存在堆栈中的,我们启动一个新的activity就会放在上一个activity上面,而我们从桌面点击应用图标的时候,由于launcher本身也是一个应用,当我们点击图标的时候,系统就会调用startActivitySately()
,一般情况下,我们所启动的activity的相关信息都会保存在intent中,比如action,category等等。我们在安装这个应用的时候,系统也会启动一个PackaManagerService
的管理服务,这个管理服务会对AndroidManifest.xml
文件进行解析,从而得到应用程序中的相关信息,比如service,activity,Broadcast等等,然后获得相关组件的信息。
当我们点击应用图标的时候,就会调用startActivitySately()
方法,而这个方法内部则是调用startActivty()
,而startActivity()
方法最终还是会调用startActivityForResult()
这个方法。而在startActivityForResult()
这个方法。因为startActivityForResult()
方法是有返回结果的,所以系统就直接给一个-1,就表示不需要结果返回了。
而startActivityForResult()
这个方法实际是通过Instrumentation类中的execStartActivity()
方法来启动activity,Instrumentation这个类主要作用就是监控程序和系统之间的交互。而在这个execStartActivity()
方法中会获取ActivityManagerService
的代理对象,通过这个代理对象进行启动activity。启动会就会调用一个checkStartActivityResult()
方法,如果说没有在配置清单中配置有这个组件,就会在这个方法中抛出异常了。当然最后是调用的是Application.scheduleLaunchActivity()
进行启动activity,而这个方法中通过获取得到一个ActivityClientRecord
对象,而这个ActivityClientRecord
通过handler来进行消息的发送,系统内部会将每一个activity组件使用ActivityClientRecord
对象来进行描述,而ActivityClientRecord
对象中保存有一个LoaderApk
对象,通过这个对象调用handleLaunchActivity
来启动activity组件,而页面的生命周期方法也就是在这个方法中进行调用。