17.进程相关

1. android中进程的优先级?

1. 前台进程:

即与用户正在交互的Activity或者Activity用到的Service等,如果系统内存不足时前台进程是最晚被杀死的

2. 可见进程:

可以是处于暂停状态(onPause)的Activity或者绑定在其上的Service,即被用户可见,但由于失了焦点而不能与用户交互

3. 服务进程:

其中运行着使用startService方法启动的Service,虽然不被用户可见,但是却是用户关心的,例如用户正在非音乐界面听的音乐或者正在非下载页面下载的文件等;当系统要空间运行,前两者进程才会被终止

4. 后台进程:

其中运行着执行onStop方法而停止的程序,但是却不是用户当前关心的,例如后台挂着的QQ,这时的进程系统一旦没了有内存就首先被杀死

5. 空进程:

不包含任何应用程序的进程,这样的进程系统是一般不会让他存在的

2. 多进程场景遇见过么?

1、在新的进程中,启动前台Service,播放音乐。 2、一个成熟的应用一定是多模块化的。首先多进程开发能为应用解决了OOM问题,因为Android对内存的限制是针对于进程的,所以,当我们需要加载大图之类的操作,可以在新的进程中去执行,避免主进程OOM。而且假如图片浏览进程打开了一个过大的图片,java heap 申请内存失败,该进程崩溃并不影响我主进程的使用。

3. Android中跨进程通讯的几种方式

1:访问其他应用程序的Activity 如调用系统通话应用

Intent callIntent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:12345678");
startActivity(callIntent);
<span class="copy-code-btn">&#x590D;&#x5236;&#x4EE3;&#x7801;</span>

2:Content Provider 如访问系统相册

3:广播(Broadcast) 如显示系统时间

4:AIDL服务

4. Andorid 进程分类

Android 中,同一个应用的所有组件在默认情况下都运行在同一个进程中,但也可以通过修改 manifest 文件中的 android:process 属性来指定该组件要运行中那个进程,也可以让不同应用的组件们运行在同一个进程中,当然这些应用要共享一个用户 ID 并并且有相同的数字证书。

Android 可能在某个时刻决定关闭一个进程,当决定要关闭那些进程的时候,系统会衡量每个进程与用户的紧密程度,这时候就跟 Android 中进程的级别有关了。像一个具有可见的activity 的进程要比那些 activity 都是不可见的进程拥有更高的等级,更不容易被系统杀死。

1、前台进程

用户当前正在做的事情需要这个进程。如果满足下面的条件之一,一个进程就被认为是前台进程:

这个进程拥有一个正在与用户交互的 Activity(这个 Activity 的 onResume()方法被调用)。

这个进程拥有一个绑定到正在与用户交互的 activity 上的 Service。

这个进程拥有一个前台运行的 Service(service 调用了方法 startForeground()).

这个进 程拥有一个正 在执行其 任何一个生命 周期回调 方法( onCreate(),onStart(),或onDestroy())的 Service。

这个进程拥有正在执行其 onReceive()方法的 BroadcastReceiver。

通常,在任何时间点,只有很少的前台进程存在。它们只有在达到无法调合的矛盾时才会被杀--如内存太小而不能继续运行时。通常,到了这时,设备就达到了一个内存分页调度状态,所以需要杀一些前台进程来保证用户界面的反应

2、可见进程

一个进程不拥有运行于前台的组件,但是依然能影响用户所见。满足下列条件时,进程即为可见:

这个进程拥有一个不在前台但仍可见的 Activity(它的 onPause()方法被调用)。当一个前台activity 启动一个对话框时,就出了这种情况。

3、服务进程

一个可见进程被认为是极其重要的。并且,除非只有杀掉它才可以保证所有前台进程的运行,否则是不能动它的。

这个进程拥有一个绑定到可见 activity 的 Service。

一个进程不在上述两种之内,但它运行着一个被 startService()所启动的 service。

尽管一个服务进程不直接影响用户所见,但是它们通常做一些用户关心的事情(比如播放音乐或下载数据),所以系统不到前台进程和可见进程活不下去时不会杀它。

4、后台进程

一个进程拥有一个当前不可见的 activity(activity 的 onStop()方法被调用)。

这样的进程们不会直接影响到用户体验,所以系统可以在任意时刻杀了它们从而为前台、可见、以及服务进程们提供存储空间。通常有很多后台进程在运行。它们被保存在一个 LRU(最近最少使用)列表中来确保拥有最近刚被看到的 activity 的进程最后被杀。如果一个 activity正确的实现了它的生命周期方法,并保存了它的当前状态,那么杀死它的进程将不会对用户的可视化体验造成影响。因为当用户返回到这个 activity 时,这个 activity 会恢复它所有的可见状态。

5、空进程

一个进程不拥有入何 active 组件。

保留这类进程的唯一理由是高速缓存,这样可以提高下一次一个组件要运行它时的启动速度。系统经常为了平衡在进程高速缓存和底层的内核高速缓存之间的整体系统资源而杀死它们。

https://www.cnblogs.com/jiuguimianju/p/4162102.html

5. 什么要用多进程?有哪些方式?怎么使用多进程

【参考】那么多进程应该能为我们带来什么呢?

我们都知道,android 平台对应用都有内存限制,其实这个理解有点问题,应该是说 android平台对每个进程有内存限制,比如某机型对对进程限制是 24m,如果应用有两个进程,则该应该的总内存限制是 2*24m。使用多进程就可以使得我们一个 apk 所使用的内存限制加大几倍。所以可以借此图片平台对应用的内存限制,比如一些要对图片、视频、大文件进程处理的好,内存的应用可以考虑用多进程来解决应用操作不流畅问题。

开启多进程模式: 在 Android 中 使 用多 进程 只 有 一 种方 法,那 就是 在 AndroidManifest 中 给 四 大 组件(Activity,Service,Receiver,ContentProvider)指定 android:process 属性.除此之外没有其他的办法,也就是说我们无法给一个线程活一个实体类指定其运行时所在的进程.其实还有另一种非常规的多进程方法,那就是通过 JNI 在 native 层去 fork 一个新的进程,但这种方法属于特殊情况,并不是常用的创建多进程的方式,所以我们也暂不考虑这种情况进程名以":"开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中,而进程名不以":"开头的进程属于全局进程,其他应用通过 ShareUID 方式可以和它跑在同一个进程中.用多进程的好处与坏处

好处:

1)分担主进程的内存压力。

当应用越做越大,内存越来越多,将一些独立的组件放到不同的进程,它就不占用主进程的内存空间了。当然还有其他好处,有心人会发现

2)使应用常驻后台,防止主进程被杀守护进程,守护进程和主进程之间相互监视,有一方被杀就重新启动它。Android 后台进程里有很多应用是多个进程的,因为它们要常驻后台,特别是即时通讯或者社交应用,不过现在多进程已经被用烂了。

典型用法是在启动一个不可见的轻量级私有进程,在后台收发消息,或者做一些耗时的事情,或者开机启动这个进程,然后做监听等。

坏处:消耗用户的电量。

多占用了系统的空间,若所有应用都这样占用,系统内存很容易占满而导致卡顿。应用程序架构会变得复杂,因为要处理多进程之间的通信。这里又是另外一个问题了。

多进程的缺陷进程间的内存空间是不可见的。开启多进程后,会引发以下问题:

1)Application 的多次重建。

2)静态成员的失效。

3)文件共享问题。

4)断点调试问题。

https://blog.csdn.net/spencer_hale/article/details/54968092

https://blog.csdn.net/u010019468/article/details/72782098

6. 看你简历上写熟悉 AIDL ,说一说 oneway 吧

posted @ 2022-02-12 13:49  契阔  阅读(39)  评论(0编辑  收藏  举报