极力推荐文章:欢迎收藏
和您一起终身学习,这里是程序员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()
bindservice
这种方式进行启动service
好处是更加便利activity
中操作service
,如果要在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
组件,而页面的生命周期方法也就是在这个方法中进行调用。
4、Broadcast注册方式与区别
此处延伸:什么情况下用动态注册
Broadcast
广播,注册方式主要有两种.静态注册
,也可成为常驻型广播,这种广播需要在Androidmanifest.xml
中进行注册,这中方式注册的广播,不受页面生命周期的影响,即使退出了页面,也可以收到广播这种广播一般用于想开机自启动啊等等,由于这种注册的方式的广播是常驻型广播,所以会占用CPU
的资源。
第二种是动态注册
,而动态注册的话,是在代码中注册的,这种注册方式也叫非常驻型广播,受到生命周期的影响,退出页面后,就不会收到广播,我们通常运用在更新UI方面。这种注册方式优先级较高。最后需要解绑,否会会内存泄露
广播是分为有序广播和无序广播。
5、HttpClient与HttpUrlConnection的区别
此处延伸:Volley
里用的哪种请求方式
首先HttpClient
和HttpUrlConnection
这两种方式都支持Https
协议,都是以流的形式进行上传或者下载数据,也可以说是以流的形式进行数据的传输,还有ipv6,
以及连接池等功能。HttpClient
这个拥有非常多的API
,所以如果想要进行扩展的话,并且不破坏它的兼容性的话,很难进行扩展,也就是这个原因,Google
在Android6.0
的时候,直接就弃用了这个HttpClient
.
而HttpUrlConnection
相对来说就是比较轻量级了,API
比较少,容易扩展,并且能够满足Android
大部分的数据传输。比较经典的一个框架volley
,在Android 2.3
版本以前都是使用Android HttpClient
,在Android 2.3
以后就使用了HttpUrlConnection
。
6、java虚拟机和Dalvik虚拟机的区别
Java虚拟机:
1、java
虚拟机基于栈。java
虚拟机运行的是java
字节码。java
类会被编译成一个或多个字节码.class
文件.
Dalvik虚拟机:
1、dalvik
虚拟机是基于寄存器的Dalvik
运行的是自定义的.dex
字节码格式。java
类被编译成.class
文件后,会通过一个dx
工具将所有的.class
文件转换成一个.dex
文件,然后dalvik
虚拟机会从其中读取指令和数据.32
位的索引,以 简化解释器。android
应用的线程都是对应一个linux
线程,都运行在自己的沙盒中,不同的应用在不同的进程中运行。每个android dalvik
应用程序都被赋予了一个独立的linux PID(app_*)
7、进程保活(不死进程)
此处延伸:进程的优先级是什么
当前业界的Android
进程保活手段主要分为黑、白、灰三种,其大致的实现思路如下:app
进程,用广播相互唤醒,包括利用系统提供的广播进行唤醒.
白色保活:启动前台Service
Service
黑色保活app
进程使用广播来进行相互唤醒。举个3个比较常见的场景:app
SDK
也会唤醒相应的app
进程,如微信sdk
会唤醒微信,支付宝sdk
会唤醒支付宝。由此发散开去,就会直接触发了下面的 场景3阿里系的app
,那么你打开任意一个阿里系的app
后,有可能就顺便把其他阿里系的app
给唤醒了。(只是拿阿里打个比方,其实BAT
系都差不多)
白色保活api
启动一个前台的Service
进程,这样会在系统的通知栏生成一个Notification
,用来让用户知道有这样一个app
在运行着,哪怕当前的app
退到了后台。
灰色保活Service
进程,与普通的启动方式区别在于,它不会在系统通知栏处出现一个