面试题可以温故知新

  1. 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状态时不可见的。

  2. onStart()和onResume()的区别?

    onStart()是activity界面被显示出来的时候执行的,用户可见,包括有一个activity在他上面,但没有将它完全覆盖,用户可以看到部分activity但不能与它交互

    onResume()是当该activity与用户能进行交互时被执行,用户可以获得activity的焦点,能够与用户交互。

    onStart()通常就是onStop()(也就是用户按下了home键,activity变为后台后),之后用户再切换回这个activity就会调用onRestart()而后调用onStart()

    onResume()是onPause()(通常是当前的acitivty被暂停了,比如被另一个透明或者Dialog样式的Activity覆盖了),之后dialog取消,activity回到可交互状态,调用onResume()。

  3. 如何理解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等。

  4. 使用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) 以返回实现了接口的对象实例

  5. Serializable 和 Parcelable 的区别?

    在使用内存的时候,Parcelable 类比 Serializable 性能高,所以推荐使用 Parcelable 类。

    Serializable 在序列化的时候会产生大量的临时变量,从而引起频繁的 GC。

    Parcelable 不能使用在要将数据存储在磁盘上的情况。尽管 Serializable 效率低点,但在这种情况下,还是建议你用 Serializable 。

  6. wait()和sleep()的区别?

    sleep来自Thread类,和wait来自Object类

    调用sleep()方法的过程中,线程不会释放对象锁。而 调用 wait 方法线程会释放对象锁

    sleep睡眠后不出让系统资源,wait让出系统资源其他线程可以占用CPU

    sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒

  7. Binder机制?

    前首先需要明确Binder的工作流程四个组件Client、Server、Service Manager和Binder驱动程序:

    1)客户端首先获得服务器端的代理对象。所谓的代理对象实际上就是在客户端建立一个服务端的“引用”,该代理对象具有服务端的功能,使其在客户端访问服务端的方法就像访问本地方法一样。

    2)客户端通过调用服务器代理对象的方式向服务器端发送请求。

    3)代理对象将用户请求通过Binder驱动发送到服务器进程。

    4)服务器进程处理用户请求,并通过Binder驱动返回处理结果给客户端的服务器代理对象。

    5)客户端收到服务器端的返回结果。

  8. 线程间几种通信方式

    1.runOnUiThread(Runnable)              在子线程中直接使用该方法,可以更新UI

    2.View.postDelay(Runnable , long)/new Handler().postDelayed(Runnable)

    在需要更新UI的地方调用该方法,Runnable对象的方法里,直接操作UI;long是指延迟多少秒

    //延迟一秒钟出现     

    3.使用Handler

    4.使用AsyncTask

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值