详解Android 进程
多进程
如果需要的时候,app可以创建多进程。
在进程里面
各类组件元素的清单文件条目、、和
—均支持android:process属性,此属性可以指定该组件应在哪个进程运行。
默认进程就是主进程。其他进程一般来说都是子进程。
2个activity在不同的进程里面,可以刷新UI吗?
测试结果:ActivityProgressB可以正常显示。这个其实很好理解,如果你打开系统相机页面,那个activity肯定与你的app不再一个进程,但是他可以很顺利的打开,所以可以支持。
保活
OOM_ADJ
这个就是oom回kill进程的优先级。
进程kill的方式
| 场景 | 接口 | 范围 |
|---|---|---|
| LowMemoryKiller | LowMemoryKiller | 从进程的优先级依次kill,释放内存 |
| 三方kill(无root) | killbackgroundprogersss | killoom_adj>4 |
| 三方kill(有root) | forcestoporkill | 理论上所有,一般是非系统和可见进程 |
| 厂商kill功能 | forcestoporkill | 理论上所有,包括native |
进程保活的目的,就是提供进程的优先级,降低进程被kill的概率。
保活的套路
开启1个像素的activity
2020-08-1414:29:48.6301164-8504/system_processW/ActivityTaskManager:Backgroundactivitystart[callingPackage:com.demanmath.androidms;callingUid:10398;isCallingUidForeground:false;isCallingUidPersistentSystemProcess:false;realCallingUid:10398;isRealCallingUidForeground:false;isRealCallingUidPersistentSystemProcess:false;originatingPendingIntent:null;isBgStartWhitelisted:false;intent:Intent{flg=0x10000000cmp=com.demanmath.androidms/.androidsample.LiveActivity};callerApp:ProcessRecord{a168b712429:com.demanmath.androidms/u0a398}]
在androidQ以后,不允许后台进程启动后台页面了。也就是想启动一个前台页面
使用前台服务
packagecom.demanmath.androidms.androidsample
importandroid.annotation.TargetApi
importandroid.app.Notification
importandroid.app.NotificationChannel
importandroid.app.NotificationManager
importandroid.app.Service
importandroid.content.Context
importandroid.content.Intent
importandroid.os.Build
importandroid.os.Handler
importandroid.os.IBinder
importandroidx.core.app.NotificationCompat
importcom.demanmath.androidms.AppLog
importcom.demanmath.androidms.R
/**
*@authorDemanMath
*@date2020/8/14
*
*/
classKeepLiveService:Service(){
valNOTIFICATION_ID=0x11
valNOTIFICATION_CHANNEL_ID="demanmathId"
valchannelName="MyBackgroundService"
companionobject{
constvalNOTIFICATION_ID=0x11
}
overridefunonBind(intent:Intent?):IBinder?{
returnnull
}
overridefunonCreate(){
super.onCreate()
if(Build.VERSION.SDK_INT
但是androidQ开始以后,禁止后台进程开启前台进程,这个也是android为了省电考虑的。
多进程相互唤醒
这个就是每个app,其多个进程,如果比kill掉了,可以通过另一个唤起。从上面的前台service的功效有些类似。
同样的问题,androidQ以后无效。
JobSchedule
packagecom.demanmath.androidms.jobservice
importandroid.app.job.JobParameters
importandroid.app.job.JobService
importandroid.content.Intent
importandroid.os.Handler
importandroid.os.Message
importandroid.widget.Toast
importcom.demanmath.androidms.AppLog
/**
*@authorDemanMath
*@date2020/8/20
*
*/
classJobDemoService:JobService(){
overridefunonCreate(){
super.onCreate()
AppLog.i()
}
overridefunonStartCommand(intent:Intent?,flags:Int,startId:Int):Int{
AppLog.i()
returnsuper.onStartCommand(intent,flags,startId)
}
privatevarmHandler=object:Handler(){
overridefunhandleMessage(msg:Message){
AppLog.i()
Toast.makeText(
applicationContext,
"JobServicetaskrunning",Toast.LENGTH_SHORT
).show()
//请注意,我们手动调用了jobFinished方法。
//当onStartJob返回true的时候,我们必须手动调用jobFinished方法
//否则该应用中的其他job将不会被执行
jobFinished(msg.objasJobParameters,false)
}
}
overridefunonStartJob(params:JobParameters?):Boolean{
AppLog.i()
mHandler.sendMessage(Message.obtain(mHandler,1,params))
returntrue
}
overridefunonStopJob(params:JobParameters?):Boolean{
AppLog.i()
mHandler.removeMessages(1)
returnfalse
}
}
packagecom.demanmath.androidms.jobservice
importandroid.app.job.JobInfo
importandroid.app.job.JobScheduler
importandroid.content.ComponentName
importandroid.content.Context
importcom.demanmath.androidms.AppLog
/**
*@authorDemanMath
*@date2020/8/20
*
*/
classJobHelper(varcontext:Context){
lateinitvarjobScheduler:JobScheduler
funstartJob(){
AppLog.i()
jobScheduler=context.getSystemService(Context.JOB_SCHEDULER_SERVICE)asJobScheduler
varbuilder=JobInfo.Builder(1,ComponentName(context.packageName,JobDemoService::class.java.name))
//builder.setBackoffCriteria(1000L,JobInfo.BACKOFF_POLICY_LINEAR)
varboolean=jobScheduler.schedule(builder.build())
AppLog.i(boolean.toString())
}
}
以上就是详解Android进程的详细内容,更多关于Android进程的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。