-
Activity的四种状态?
Running状态:一个新的Activity启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。
Paused状态:当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,它仍然可见,但它已经失去了焦点,故不可与用户交互。
Stopped状态:当Activity不可见时,Activity处于Stopped状态。当Activity处于此状态时,一定要保存当前数据和当前的UI状态,否则一旦Activity退出或关闭时,当前的数据和UI状态就丢失了。
Killed状态:Activity被杀掉以后或者被启动以前,处于Killed状态。这是Activity已从Activity堆栈中移除,需要重新启动才可以显示和使用。
4种状态中,Running状态和Paused状态是可见的,Stopped状态和Killed状态时不可见的。
-
onStart()和onResume()的区别?
onStart()是activity界面被显示出来的时候执行的,用户可见,包括有一个activity在他上面,但没有将它完全覆盖,用户可以看到部分activity但不能与它交互
onResume()是当该activity与用户能进行交互时被执行,用户可以获得activity的焦点,能够与用户交互。
onStart()通常就是onStop()(也就是用户按下了home键,activity变为后台后),之后用户再切换回这个activity就会调用onRestart()而后调用onStart()
onResume()是onPause()(通常是当前的acitivty被暂停了,比如被另一个透明或者Dialog样式的Activity覆盖了),之后dialog取消,activity回到可交互状态,调用onResume()。
-
如何理解Activity,View,Window三者之间的关系?
这个问题真的很不好回答。所以这里先来个算是比较恰当的比喻来形容下它们的关系吧。Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图)LayoutInflater像剪刀,Xml配置像窗花图纸。
1:Activity构造的时候会初始化一个Window,准确的说是PhoneWindow。
2:这个PhoneWindow有一个“ViewRoot”,这个“ViewRoot”是一个View或者说ViewGroup,是最初始的根视图。
3:“ViewRoot”通过addView方法来一个个的添加View。比如TextView,Button等
4:这些View的事件监听,是由WindowManagerService来接受消息,并且回调Activity函数。比如onClickListener,onKeyDown等。
-
使用AIDL实现IPC服务的步骤是?
1. 创建.aidl文件-该文件(YourInterface.aidl)定义了客户端可用的方法和数据的接口。
2. 实现接口-创建service,实现onBind方法,onBind()返回一个内部类对象(iBinder对象),该内部类继承的命名为YourInterface.Stub的内部抽象类,并且实现在.aidl文件中声明的方法。
private class BookBinder extends IBook.Stub{
@Override
public String queryBook(int bookNo) throws RemoteException {
return queryBookName(bookNo);
}
}
3. 声明注册,Action: com.aidy.a.aidlservice.RemoteService就是进程之间可以进行通信的一个契约ID
Intent service = new Intent("com.andyidea.aidl.bookservice");
bindService(service, bookConn, BIND_AUTO_CREATE);
如果是本地的 bindService(new Intent(MainActivity.this, SocketService.class),serviceConnection, Context.BIND_AUTO_CREATE);
4. 向客户端公开接口-复制.aidl文件到客户端项目。如果是编写服务,应该继承Service并且重载Service.onBind(Intent) 以返回实现了接口的对象实例
-
Serializable 和 Parcelable 的区别?
在使用内存的时候,Parcelable 类比 Serializable 性能高,所以推荐使用 Parcelable 类。
Serializable 在序列化的时候会产生大量的临时变量,从而引起频繁的 GC。
Parcelable 不能使用在要将数据存储在磁盘上的情况。尽管 Serializable 效率低点,但在这种情况下,还是建议你用 Serializable 。
-
wait()和sleep()的区别?
sleep来自Thread类,和wait来自Object类
调用sleep()方法的过程中,线程不会释放对象锁。而 调用 wait 方法线程会释放对象锁
sleep睡眠后不出让系统资源,wait让出系统资源其他线程可以占用CPU
sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒
-
Binder机制?
前首先需要明确Binder的工作流程四个组件Client、Server、Service Manager和Binder驱动程序:
1)客户端首先获得服务器端的代理对象。所谓的代理对象实际上就是在客户端建立一个服务端的“引用”,该代理对象具有服务端的功能,使其在客户端访问服务端的方法就像访问本地方法一样。
2)客户端通过调用服务器代理对象的方式向服务器端发送请求。
3)代理对象将用户请求通过Binder驱动发送到服务器进程。
4)服务器进程处理用户请求,并通过Binder驱动返回处理结果给客户端的服务器代理对象。
5)客户端收到服务器端的返回结果。
-
线程间几种通信方式
1.runOnUiThread(Runnable) 在子线程中直接使用该方法,可以更新UI
2.View.postDelay(Runnable , long)/new Handler().postDelayed(Runnable)
在需要更新UI的地方调用该方法,Runnable对象的方法里,直接操作UI;long是指延迟多少秒
//延迟一秒钟出现
3.使用Handler
4.使用AsyncTask
面试题可以温故知新
最新推荐文章于 2022-04-29 15:22:04 发布