詳解Android 進(jìn)程
多進(jìn)程
如果需要的時(shí)候,app可以創(chuàng)建多進(jìn)程。
在進(jìn)程里面
各類組件元素的清單文件條目 、 、 和
— 均支持 android:process 屬性,此屬性可以指定該組件應(yīng)在哪個(gè)進(jìn)程運(yùn)行。
默認(rèn)進(jìn)程就是主進(jìn)程。其他進(jìn)程一般來說都是子進(jìn)程。
2個(gè)activity在不同的進(jìn)程里面,可以刷新UI嗎?
<activity android:name=".androidsample.ActivityProgressB" android:process=":progressb"/>
測(cè)試結(jié)果:ActivityProgressB可以正常顯示。這個(gè)其實(shí)很好理解,如果你打開系統(tǒng)相機(jī)頁面,那個(gè)activity肯定與你的app不再一個(gè)進(jìn)程,但是他可以很順利的打開,所以可以支持。
?;?/strong>
OOM_ADJ
這個(gè)就是oom 回kill進(jìn)程的優(yōu)先級(jí)。
進(jìn)程kill的方式
場(chǎng)景 | 接口 | 范圍 |
---|---|---|
LowMemoryKiller | LowMemoryKiller | 從進(jìn)程的優(yōu)先級(jí)依次kill,釋放內(nèi)存 |
三方kill(無root) | killbackgroundprogersss | kill oom_adj>4 |
三方kill(有root) | forcestop or kill | 理論上所有,一般是非系統(tǒng)和可見進(jìn)程 |
廠商kill功能 | force stop or kill | 理論上所有,包括native |
進(jìn)程保活的目的,就是提供進(jìn)程的優(yōu)先級(jí),降低進(jìn)程被kill的概率。
保活的套路
開啟1個(gè)像素的activity
2020-08-14 14:29:48.630 1164-8504/system_process W/ActivityTaskManager: Background activity start [callingPackage: com.demanmath.androidms; callingUid: 10398; isCallingUidForeground: false; isCallingUidPersistentSystemProcess: false; realCallingUid: 10398; isRealCallingUidForeground: false; isRealCallingUidPersistentSystemProcess: false; originatingPendingIntent: null; isBgStartWhitelisted: false; intent: Intent { flg=0x10000000 cmp=com.demanmath.androidms/.androidsample.LiveActivity }; callerApp: ProcessRecord{a168b71 2429:com.demanmath.androidms/u0a398}]
在android Q以后,不允許后臺(tái)進(jìn)程啟動(dòng)后臺(tái)頁面了。也就是想啟動(dòng)一個(gè)前臺(tái)頁面
使用前臺(tái)服務(wù)
package com.demanmath.androidms.androidsample import android.annotation.TargetApi import android.app.Notification import android.app.NotificationChannel import android.app.NotificationManager import android.app.Service import android.content.Context import android.content.Intent import android.os.Build import android.os.Handler import android.os.IBinder import androidx.core.app.NotificationCompat import com.demanmath.androidms.AppLog import com.demanmath.androidms.R /** * @author DemanMath * @date 2020/8/14 * */ class KeepLiveService:Service() { val NOTIFICATION_ID = 0x11 val NOTIFICATION_CHANNEL_ID = "demanmathId" val channelName = "My Background Service" companion object { const val NOTIFICATION_ID = 0x11 } override fun onBind(intent: Intent?): IBinder? { return null } override fun onCreate() { super.onCreate() if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { startForeground(NOTIFICATION_ID, Notification()) } else { startMyOwnForeground() startService(Intent(this, InnerService::class.java)) } } @TargetApi(value = Build.VERSION_CODES.O) private fun startMyOwnForeground() { AppLog.d() val chan = NotificationChannel( NOTIFICATION_CHANNEL_ID, channelName, NotificationManager.IMPORTANCE_NONE ) chan.lockscreenVisibility = Notification.VISIBILITY_PRIVATE val manager = (getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager) manager.createNotificationChannel(chan) val notificationBuilder = NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID) val notification = notificationBuilder.setOngoing(true) .setSmallIcon(R.drawable.ic_launcher_background) .setContentTitle("App is running in background") .setPriority(NotificationManager.IMPORTANCE_MIN) .setCategory(Notification.CATEGORY_SERVICE) .build() startForeground(NOTIFICATION_ID, notification) } class InnerService : Service() { override fun onBind(intent: Intent): IBinder? { return null } override fun onCreate() { super.onCreate() //使用channeId & channelName //發(fā)送與KeepLiveService中ID相同的Notification,然后將其取消并取消自己的前臺(tái)顯示 // val builder: Notification.Builder = Notification.Builder(this) // builder.setSmallIcon(R.mipmap.ic_launcher) // startForeground(NOTIFICATION_ID, builder.build()) Handler().postDelayed(Runnable { stopForeground(true) val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager manager.cancel(NOTIFICATION_ID) stopSelf() }, 100) } } }
但是androidQ開始以后,禁止后臺(tái)進(jìn)程開啟前臺(tái)進(jìn)程,這個(gè)也是android為了省電考慮的。
多進(jìn)程相互喚醒
這個(gè)就是每個(gè)app,其多個(gè)進(jìn)程,如果比kill掉了,可以通過另一個(gè)喚起。從上面的前臺(tái)service的功效有些類似。
同樣的問題,android Q以后無效。
JobSchedule
package com.demanmath.androidms.jobservice import android.app.job.JobParameters import android.app.job.JobService import android.content.Intent import android.os.Handler import android.os.Message import android.widget.Toast import com.demanmath.androidms.AppLog /** * @author DemanMath * @date 2020/8/20 * */ class JobDemoService:JobService() { override fun onCreate() { super.onCreate() AppLog.i() } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { AppLog.i() return super.onStartCommand(intent, flags, startId) } private var mHandler = object:Handler(){ override fun handleMessage(msg: Message) { AppLog.i() Toast.makeText( applicationContext, "JobService task running", Toast.LENGTH_SHORT ).show() //請(qǐng)注意,我們手動(dòng)調(diào)用了jobFinished方法。 //當(dāng)onStartJob返回true的時(shí)候,我們必須手動(dòng)調(diào)用jobFinished方法 //否則該應(yīng)用中的其他job將不會(huì)被執(zhí)行 jobFinished(msg.obj as JobParameters, false) } } override fun onStartJob(params: JobParameters?): Boolean { AppLog.i() mHandler.sendMessage(Message.obtain(mHandler,1,params)) return true } override fun onStopJob(params: JobParameters?): Boolean { AppLog.i() mHandler.removeMessages(1) return false } }
package com.demanmath.androidms.jobservice import android.app.job.JobInfo import android.app.job.JobScheduler import android.content.ComponentName import android.content.Context import com.demanmath.androidms.AppLog /** * @author DemanMath * @date 2020/8/20 * */ class JobHelper(var context: Context) { lateinit var jobScheduler:JobScheduler fun startJob(){ AppLog.i() jobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler var builder = JobInfo.Builder(1, ComponentName(context.packageName,JobDemoService::class.java.name)) // builder.setBackoffCriteria(1000L,JobInfo.BACKOFF_POLICY_LINEAR) var boolean = jobScheduler.schedule(builder.build()) AppLog.i(boolean.toString()) } }
以上就是詳解Android 進(jìn)程的詳細(xì)內(nèi)容,更多關(guān)于Android 進(jìn)程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Android 實(shí)現(xiàn)徹底退出自己APP 并殺掉所有相關(guān)的進(jìn)程
- 創(chuàng)建Android守護(hù)進(jìn)程實(shí)例(底層服務(wù))
- Android基于Aidl的跨進(jìn)程間雙向通信管理中心
- Android跨進(jìn)程拋異常的原理的實(shí)現(xiàn)
- Android 雙進(jìn)程守護(hù)的實(shí)現(xiàn)代碼
- android studio3.0.1無法啟動(dòng)Gradle守護(hù)進(jìn)程的解決方法
- Android進(jìn)程間通信實(shí)踐的示例代碼
- 詳解Android跨進(jìn)程IPC通信AIDL機(jī)制原理
- 詳解android webView獨(dú)立進(jìn)程通訊方式
相關(guān)文章
Flutter 移動(dòng)程序安全性提高的八個(gè)建議
這篇文章主要為大家介紹了Flutter 移動(dòng)程序安全性提高建議詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Android入門之在子線程中調(diào)用Handler詳解
這篇文章主要為大家詳細(xì)介紹了Android如何在子線程中調(diào)用Handler,文中的示例代碼講解詳細(xì),有需要的朋友可以借鑒參考下,希望能夠?qū)Υ蠹矣兴鶐椭?/div> 2022-12-12Android單項(xiàng)綁定MVVM項(xiàng)目模板的方法
這篇文章主要給大家介紹了關(guān)于Android單項(xiàng)綁定MVVM項(xiàng)目模板的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Android 使用ViewPager實(shí)現(xiàn)輪播圖效果
這篇文章主要介紹了Android 使用ViewPager實(shí)現(xiàn)輪播圖效果,通過實(shí)例代碼給大家講解了適配器和各個(gè)方法的作用介紹,需要的朋友可以參考下2017-05-05Android Kotlin環(huán)境使用ButterKnife的方法
本篇文章主要介紹了Android Kotlin環(huán)境使用ButterKnife的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03Android recyclerview實(shí)現(xiàn)縱向虛線時(shí)間軸的示例代碼
本文主要介紹了Android recyclerview實(shí)現(xiàn)縱向虛線時(shí)間軸的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07Android studio設(shè)置指定的簽名文件教程
這篇文章主要介紹了Android studio設(shè)置指定的簽名文件教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android自定義RadioGroupX實(shí)現(xiàn)多行多列布局
這篇文章主要為大家詳細(xì)介紹了Android自定義RadioGroupX實(shí)現(xiàn)多行多列布局,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Android實(shí)現(xiàn)退出時(shí)關(guān)閉所有Activity的方法
這篇文章主要介紹了Android實(shí)現(xiàn)退出時(shí)關(guān)閉所有Activity的方法,主要通過自定義類CloseActivityClass實(shí)現(xiàn)這一功能,需要的朋友可以參考下2014-09-09React Native學(xué)習(xí)之Android的返回鍵BackAndroid詳解
這篇文章主要給大家介紹了關(guān)于React Native學(xué)習(xí)之Android的返回鍵BackAndroid的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用React Native具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧。2017-10-10最新評(píng)論