Android面试题进程篇

Android面试题进程篇,由本人整理汇总,后续将推出系列篇,如果喜欢请持续关注和推荐。

操作系统进程和线程的区别 

  • 1.简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

  • 2.线程的划分尺度小于进程,使得多线程程序的并发性高。

  • 3.另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

  • 4.多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配

Handler、Looper消息队列模型,各部分的作用 

  • 1.MessageQueue:读取会自动删除消息,单链表维护,在插入和删除上有优势。在其next()中会无限循环,不断判断是否有消息,有就返回这条消息并移除。

  • 2.Looper:Looper创建的时候会创建一个MessageQueue,调用loop()方法的时候消息循环开始,loop()也是一个死循环,会不断调用messageQueue的next(),当有消息就处理,否则阻塞在messageQueue的next()中。当Looper的quit()被调用的时候会调用messageQueue的quit(),此时next()会返回null,然后loop()方法也跟着退出。

  • 3.Handler:在主线程构造一个Handler,然后在其他线程调用sendMessage(),此时主线程的MessageQueue中会插入一条message,然后被Looper使用。

  • 4.系统的主线程在ActivityThread的main()为入口开启主线程,其中定义了内部类Activity.H定义了一系列消息类型,包含四大组件的启动停止。

  • 5.MessageQueue和Looper是一对一关系,Handler和Looper是多对一

谈谈你对binder机制的理解? 

binder是一种IPC机制,进程间通讯的一种工具. Java层可以利用aidl工具来实现相应的接口.

Android中进程间通信有哪些实现方式? 

    由于应用程序之间不能共享内存。在不同应用程序之间交互数据(跨进程通讯),在Android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service:

  1. Activity可以跨进程调用其他应用程序的Activity;

  2. ContentProvider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回), 当然,也可以对其他应用程序的数据进行增、删、改操作;

  3. Broadcast可以向android系统中所有应用程序发送广播, 而需要跨进程通讯的应用程序可以监听这些广播;

  4. Service和Content Provider类似,也可以访问其他应用程序中的数据, 但不同的是,ContentProvider返回的是Cursor对象, 而Service返回的是Java对象,这种可以跨进程通讯的服务叫AIDL服务。

android的IPC通信方式,线程(进程间)通信机制有哪些 

  • 1.ipc通信方式:binder、contentprovider、socket

  • 2.操作系统进程通讯方式:共享内存、socket、管道

描述一次跨进程通讯

  • 1.client、proxy、serviceManager、BinderDriver、impl、service

  • 2.client发起一个请求service信息的Binder请求到BinderDriver中,serviceManager发现BinderDiriver中有自己的请求 然后将clinet请求的service的数据返回给client这样完成了一次Binder通讯

  • 3.clinet获取的service信息就是该service的proxy,此时调用proxy的方法,proxy将请求发送到BinderDriver中,此时service的 Binder线程池循环发现有自己的请求,然后用impl就处理这个请求最后返回,这样完成了第二次Binder通讯

  • 4.中间client可挂起,也可以不挂起,有一个关键字oneway可以解决这个

Android开发中何时使用多进程?使用多进程的好处是什么? 

    要想知道如何使用多进程,先要知道Android里的多进程概念。一般情况下,一个应用程序就是一个进程,这个进程名称就是应用程序包名。我们知道进程是系统分配资源和调度的基本单位,所以每个进程都有自己独立的资源和内存空间,别的进程是不能任意访问其他进程的内存和资源的。

如何让自己的应用拥有多个进程?

    很简单,我们的四大组件在AndroidManifest文件中注册的时候,有个属性是android:process,1.这里可以指定组件的所处的进程。默认就是应用的主进程。指定为别的进程之后,系统在启动这个组件的时候,就先创建(如果还没创建的话)这个进程,然后再创建该组件。你可以重载Application类的onCreate方法,打印出它的进程名称,就可以清楚的看见了。再设置android:process属性时候,有个地方需要注意:如果是android:process=”:deamon”,以:开头的名字,则表示这是一个应用程序的私有进程,否则它是一个全局进程。私有进程的进程名称是会在冒号前自动加上包名,而全局进程则不会。一般我们都是有私有进程,很少使用全局进程。

如何保证Service不被杀死? 

从3个层面入手:

  • A.提供进程优先级,降低进程被杀死的概率:

    • 方法一:监控手机锁屏解锁事件,在屏幕锁屏时启动1个像素的 Activity,在用户解锁时将 Activity 销毁掉。

    • 方法二:启动前台service。

    • 方法三:提升service优先级: 在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播。 

  • B. 在进程被杀死后,进行拉活:

    • 方法一:注册高频率广播接收器,唤起进程。如网络变化,解锁屏幕,开机等

    • 方法二:双进程相互唤起。

    • 方法三:依靠系统唤起。

    • 方法四:onDestroy方法里重启service:service +broadcast 方式,就是当service走ondestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service;

  • C. 依靠第三方根据终端不同:

    • 在小米手机(包括 MIUI)接入小米推送、华为手机接入华为推送;其他手机可以考虑接入腾讯信鸽或极光推送与小米推送做 A/B Test。

 

讲一下android中进程的优先级? 

前台进程 可见进程 服务进程 后台进程 空进程

应用常驻后台,避免被第三方杀掉的方法 

  1. Service设置成START_STICKY kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样

  2. 通过 startForeground将进程设置为前台进程, 做前台服务,优先级和前台应用一个级别,除非在系统内存非常缺,否则此进程不会被 kill

  3. 双进程Service: 让2个进程互相保护对方,其中一个Service被清理后,另外没被清理的进程可以立即重启进程

  4. 用C编写守护进程(即子进程) : Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影响(Android5.0以上的版本不可行)

  5. 联系厂商,加入白名单

如果喜欢本文章,请关注Android高级编程微信公众号,有更多精彩内容提供:

你可能感兴趣的:(Android面试题进程篇)