android优先级,android前台服务

android app程序与服务优先级哪个高

service与application的生命周期有关系的。

成都创新互联成都企业网站建设服务,提供网站设计制作、成都做网站网站开发,网站定制,建网站,网站搭建,网站设计,成都响应式网站建设,网页设计师打造企业风格网站,提供周到的售前咨询和贴心的售后服务。欢迎咨询做网站需要多少钱:18982081108

在Android中进程按优先级可以分为五类,优先级从高到低排列:

前台进程 该进程包含正在与用户进行交互的界面组件,比如一个Activity。

可视进程 该进程中的组件虽然没有和用户交互,但是仍然可以被看到。

服务进程 该进程包含在执行后台操作的服务组件,比如播放音乐的Service。

后台进程 该进程包含的组件没有与用户交互,用户也看不到 Service。

空进程 没有任何界面组件、服务组件,或触发器组件。

Android系统是进程托管的,也就是说进程都是由系统来管理,系统会按照特定的算来来回收这些进程。在回收中秉承几个原则:

1. 尽量延长进程的生命周期,不到必须的情况下不会回收,因为系统回收进程会影响用户体验

2. 按优先级从低到高进行回收

3. 同等优先级的进程越近使用越晚回收。

通过上面这些解释,进程过一段时间后是会被回收的,但要遵循上面的这些原则,service和application的生命周期有关,只要进程被回收,那么它所占用的所有资源将被回收。

Android线程优先级和进程oom_adj

在处理app启动速度的时候,可以设置主线程的优先级,保证主线程占用的cpu足够久。进程的oom_adj,决定了当内存不够的时候,lmk会根据oom_adj的大小依次释放内存。

android中对线程等级划分如下:

设置线程的优先级分为:android 提供的api和java sdk自带的api

注意: 要使用android提供的api设置,用java提供的作用不够显著

作用: 可以在主线程设置主线层等级;在Glide加载图片的时候设置低优先级。当图片量很大的时候可以降低加载图片线程的等级

android内存不够了,会触发oom机制,lowMemoryKiller会根据每个进程的oom_adj的等级,依次杀死进程,释放内存。

lom会根据free的内存的值,来判断kill掉哪个等级下的进程。例如当空闲内存只有64M了。会kill掉oom_adj 为12-15的进程

真实案例:应用A跳到第三方应用B,在第三方应用B中播放视频,加载大量图片,导致返回的时候,应用A走了SplashActivity。通过logcat发现A应用被kill掉了

Android提升服务进程优先级

在android应用开发时,我们经常会在后台开一个service,来处理一些业务操作。最近公司的一个项目就是,通过service不断地和硬件设备交互,获取数据,在页面长时间停留在一个页面时,手机的屏幕会出项锁屏的状况,这时,我们的应用的优先级就会下降,很多次,等打开屏幕的瞬间,我发现原来的原来的进程被杀死了,应用又回到了首页,尤其是在Android高版本的系统中尤为突出。所以下面我们通过提成优先级的方式,来进行进程保活

2.在程序开始的地方注册这个广播接收者

4.定义这个activity的style属性 value - style.xml 文件

5.Androidmanifest文件中注册这个activity

大功告成!

经过测试,本人的华为荣耀9i,原来存在的问题被解决了,希望大家能互相交流经验。

Android 进程管理篇(五)-调度策略与优先级

接上篇cpuset,这篇来看看进程优先级与调度策略管理。

Linux中,优先级号一共有0-139,其中0-99的是RT(实时)进程,100-139的是非实时进程。

数字越低优先级越高。

SCHED_IDLE idle状态低优先级进程调度

先看Process中调度策略的划分,与上面介绍的一样。

首先在AMS中封装了FIFO和NORMAL的两个策略,NORMAL好说,看看FIFO在哪用到

这里Process.setThreadScheduler并没有太多的应用,我们直接来看优先级设置吧。else中将top app的UI线程与render线程都设置为TOP_APP_PRIORITY_BOOST优先级,nice值为-10,非常高。

这里主要调用androidSetThreadPriority方法

这里通过set_sched_policy来调整调度策略,并通过setpriority设置进程优先级。这里不特意区分进程与线程了,反正在linux中都是进程。

这里与前面的cpuset非常相似,依然是写节点,节点前面也提了就是:

那么这里又引入了一个schedtune子系统,简单介绍下:

schedtune是ARM/Linaro为了EAS新增的一个子系统,主要用来控制进程调度选择CPU以及boost触发。通过权重来分配CPU负载能力来实现快速运行。高权重意味着会享受到更好的cpu负载来处理对应的任务,换句话说你能享受相对更好的cpu运行性能。

简单梳理下schedtune和不同类型SchedPolicy之间的对应关系:

看下具体文件夹内容:

系统配置:

这里/dev/stune相关配置只做了这么一个

android开发如何将进程放到优先级最高

有几种方法可供参考:

方法1: 提高进程优先级 startForeground(1, new Notification()); 降低进程优先级 stopForeground(true);

onStart() 方法中进行提高优先级操作,然后在onStop()方法中进行降低优先级操作

这个方法可以将对应AP的ADJ临时提高到2。

方法2:

找到这个进程对应的AndroidMannifest.xml文件,在其中添加属性『android:persistent="true"』, 这样可以将该进程设置为常驻内存进程,就可以降低被Kill的概率。以Acore进程为例, 在 /package/providers/ContactsProvider/AndroidMannifest.xml 文件中增加一行『android:persistent="true"』

具体修改示例如下:

application android:process="android.process.acore" android:label="@string/app_label"

android:icon="@drawable/app_icon"

android:allowBackup="false"

android:persistent="true"

方法3:

在需要提高优先级的地方调用:

final Intent it = new Intent();

it.setAction("android.intent.action.BOOST_DOWNLOADING");

it.putExtra("package_name", "com.android.contacts");

it.putExtra("enabled", true);

context.sendBroadcast(it);

在需要恢复到正常优先级时调用:

final Intent it = new Intent();

it.setAction("android.intent.action.BOOST_DOWNLOADING");

it.putExtra("package_name", "com.android.contacts");

it.putExtra("enabled", false);

context.sendBroadcast(it);

onStart() 方法中进行提高优先级操作,然后在onStop()方法中进行降低优先级操作

这个方法可以将对应AP的ADJ临时提高到7。

Android资源标签属性及优先级(一)

在写前一篇文章 浅述Android Apk打包流程 的时候发现解压后的apk里res的资源文件,有多于我本地项目中的res资源文件夹。

如果我的项目中依赖了Android的一些库,比如design库,design里面有自己的res,那么在打包我的项目的时候,这些res会合并一起打包。

我查看了下,我确实依赖了design等库。

对比一下前三张图,我本地项目没有建anim、anim-v21、animator-v21(不再截图了)等资源文件夹,但是design库有,最终一并打包到我的项目中。

res目录下的文件夹是有命名规则的,不能随便起,为的是要适配不同的设备,而且是要做到最佳的资源匹配。

2.1、资源标签属性及优先级

除了分辨率外,同种资源之间可以有下面许多资源属性标签,它们在匹配过程中是有优先级顺序的。大家可以快速浏览一下即可。以下资源标签修饰语按照优先级从高到低的顺序排列。

3、Locale(语言和区域)

例如en表示英语,fr表示法语,en-rUS表示英语和美国地区。不区分大小写,r用于区分区域码。

4、Layout Direction(布局方向)

ldrtl,布局方向从右到左(阿拉伯语等会这样布局);ldltr,布局方向从左到右,是默认的隐式值。(这就解答了我前面第二个提的问题了)

5、Smallest Screen Width(最小宽度)

swNdp,屏幕的基本尺寸。

sw320dp:适用于320 320 ldpi、320 480 mdpi、480 480 hdpi

sw600dp:适用于600 1024mdpi (7英寸的平板电脑)

sw720dp:适用于720*1280 mdpi (10英寸平板电脑)

当你的屏幕的绝对宽度大于600dp时,屏幕就会自动调用layout-sw600dp文件夹里面的布局。这里的绝对宽度是指手机的实际宽度,即与手机是否横屏没关系,也就是手机较小的边的长度。

6、Screen Width(屏幕宽度)

wNdp ,设备的可用宽度值随着当前是横屏还是竖屏会产生变化,即它表示的是当前真实的宽度值。即当手机竖屏时,为较小边的长度;当手机横屏时,为较长边的长度。

7、Screen Height(屏幕高度)

hNdp,与lScreen Width的使用一样,只是这里指的是相对的高度。指手机相对放置的高度;即当手机竖屏时,为较长边的长度;当手机横屏时,为较小边的长度。

8、Size(屏幕大小)

samll:低密度,最小布局尺寸为320 426dp

normal:中等密度,标准屏幕最小布局尺寸约为320 470dp

large:中等密度,大屏幕最小布局尺寸为480 640dp

xlarge:大于中等密度,最小布局尺寸为720 960dp。基本用于平板电脑。

该配置并不仅适用于指定设备,如果没有匹配的资源,会选择与之最近的。 如果所有资源均大于当前屏幕的尺寸限定符,则系统不会使用这些资源,且应用运行时会崩溃。

9、Ratio(屏幕纵横比)

long:宽屏

notlong:非宽屏

10、Orientation(屏幕方向)

port:竖向的

land:横向的

square:正方形的(我也不知道这个是什么样子的)

11、UI Mode(UI模式)

无、car、desk、 television、appliance、 watch6种模式。(其实我没看明白是干嘛的,哈哈)

12、Night Mode(夜间模式)

night:夜间模式

notnight:非夜间模式

可以通过UiModeManager来开启和关闭这一功能。

13、Density(屏幕像素密度)

ldpi:低密度,约120dpi;mdpi:中等密度,160dpi;hdpi:高密度,240dpi;xhdpi:超高密度,320dpi;xxhdpi:超超高密度,480dpi;xxxhdpi:超超超高密度,640dpi;nodpi:不希望以匹配设备密度的位图资源;tvdpi:主要用于电视,约213dpi。anydpi:适用于所有密度,优先级高于其他限定符。

14、Touch Screen(触摸屏)

notouch:设备不带触摸屏

stylus:触摸屏通过手写笔操作

finger:触摸屏通过手指操作

15、Keyboard(键盘可用性)

keysexposed:设备有可用键盘。如果当前的软键盘被启用,那么即便设备没有键盘或者键盘不可用,这个状态仍可能有效。

keyshidden:设备有键盘,但当前被隐藏,而且没有软键盘启用。

keyssoft:设备当前软键盘启动,即便它处于可见或不可见状态。

16、Text Input(文本输入法)

nokeys:设备不带用用于文本输入的按键

qwerty:设备具有标准硬键盘(无论是否对用户可见)

12key:设备具有 12 键硬键盘(无论是否对用户可见)

17、Navigation State(定位键可用性)

描述定位键是否可用,指的是光标定位,非GPS导航的定位。

navexposed:定位键对用户可用

navhidden:定位键对用户不可用

18、Navigation Method(主要的非触摸屏定位方式)

nonav:设备除了触摸屏外没有其他定位方式

dpad:设备具有用于导航的方向键

trackball:设备具有用于导航的轨迹球

wheel:设备有方向滚轮用于定位,不常用

19、Dimension(尺寸)

20、Version(平台版本)

设备支持的 API 级别。例如v4 对应于 API 级别 4,带有 Android 1.6 或更高版本系统的设备。

2.2、怎么在AS中创建这些文件夹呢?


网页题目:android优先级,android前台服务
转载来源:http://scyanting.com/article/dsioiip.html