详解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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。