詳解Android 進(jìn)程
多進(jìn)程
如果需要的時候,app可以創(chuàng)建多進(jìn)程。
在進(jìn)程里面
各類組件元素的清單文件條目 、 、 和
— 均支持 android:process 屬性,此屬性可以指定該組件應(yīng)在哪個進(jìn)程運行。
默認(rèn)進(jìn)程就是主進(jìn)程。其他進(jìn)程一般來說都是子進(jìn)程。
2個activity在不同的進(jìn)程里面,可以刷新UI嗎?
<activity android:name=".androidsample.ActivityProgressB" android:process=":progressb"/>
測試結(jié)果:ActivityProgressB可以正常顯示。這個其實很好理解,如果你打開系統(tǒng)相機(jī)頁面,那個activity肯定與你的app不再一個進(jìn)程,但是他可以很順利的打開,所以可以支持。
?;?/strong>
OOM_ADJ
這個就是oom 回kill進(jìn)程的優(yōu)先級。
進(jìn)程kill的方式
場景 | 接口 | 范圍 |
---|---|---|
LowMemoryKiller | LowMemoryKiller | 從進(jìn)程的優(yōu)先級依次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ìn)程被kill的概率。
?;畹奶茁?/strong>
開啟1個像素的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以后,不允許后臺進(jìn)程啟動后臺頁面了。也就是想啟動一個前臺頁面
使用前臺服務(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,然后將其取消并取消自己的前臺顯示 // 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開始以后,禁止后臺進(jìn)程開啟前臺進(jìn)程,這個也是android為了省電考慮的。
多進(jìn)程相互喚醒
這個就是每個app,其多個進(jìn)程,如果比kill掉了,可以通過另一個喚起。從上面的前臺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() //請注意,我們手動調(diào)用了jobFinished方法。 //當(dāng)onStartJob返回true的時候,我們必須手動調(diào)用jobFinished方法 //否則該應(yīng)用中的其他job將不會被執(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)程的資料請關(guān)注腳本之家其它相關(guān)文章!
- Android 實現(xiàn)徹底退出自己APP 并殺掉所有相關(guān)的進(jìn)程
- 創(chuàng)建Android守護(hù)進(jìn)程實例(底層服務(wù))
- Android基于Aidl的跨進(jìn)程間雙向通信管理中心
- Android跨進(jìn)程拋異常的原理的實現(xiàn)
- Android 雙進(jìn)程守護(hù)的實現(xiàn)代碼
- android studio3.0.1無法啟動Gradle守護(hù)進(jìn)程的解決方法
- Android進(jìn)程間通信實踐的示例代碼
- 詳解Android跨進(jìn)程IPC通信AIDL機(jī)制原理
- 詳解android webView獨立進(jìn)程通訊方式
相關(guān)文章
Android入門之在子線程中調(diào)用Handler詳解
這篇文章主要為大家詳細(xì)介紹了Android如何在子線程中調(diào)用Handler,文中的示例代碼講解詳細(xì),有需要的朋友可以借鑒參考下,希望能夠?qū)Υ蠹矣兴鶐椭?/div> 2022-12-12Android 使用ViewPager實現(xiàn)輪播圖效果
這篇文章主要介紹了Android 使用ViewPager實現(xiàn)輪播圖效果,通過實例代碼給大家講解了適配器和各個方法的作用介紹,需要的朋友可以參考下2017-05-05Android Kotlin環(huán)境使用ButterKnife的方法
本篇文章主要介紹了Android Kotlin環(huán)境使用ButterKnife的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03Android recyclerview實現(xiàn)縱向虛線時間軸的示例代碼
本文主要介紹了Android recyclerview實現(xiàn)縱向虛線時間軸的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-07-07Android studio設(shè)置指定的簽名文件教程
這篇文章主要介紹了Android studio設(shè)置指定的簽名文件教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android自定義RadioGroupX實現(xiàn)多行多列布局
這篇文章主要為大家詳細(xì)介紹了Android自定義RadioGroupX實現(xiàn)多行多列布局,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09Android實現(xiàn)退出時關(guān)閉所有Activity的方法
這篇文章主要介紹了Android實現(xiàn)退出時關(guān)閉所有Activity的方法,主要通過自定義類CloseActivityClass實現(xiàn)這一功能,需要的朋友可以參考下2014-09-09React Native學(xué)習(xí)之Android的返回鍵BackAndroid詳解
這篇文章主要給大家介紹了關(guān)于React Native學(xué)習(xí)之Android的返回鍵BackAndroid的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用React Native具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起看看吧。2017-10-10最新評論