- 現(xiàn)在大型的app都采用多個(gè)進(jìn)程來(lái)分擔(dān)單個(gè)進(jìn)程的壓力,在清單文件中配置android:process屬性,確定是否在同一個(gè)進(jìn)程中,如圖中有2個(gè)不同的進(jìn)程:
- 進(jìn)程名以“:”開頭的進(jìn)程屬于當(dāng)前應(yīng)用的私有進(jìn)程妖胀,其他應(yīng)用的組件不可以和它跑在同一個(gè)進(jìn)程當(dāng)中
不以“:”開頭的進(jìn)程屬于全局進(jìn)程赠幕,其他應(yīng)用通過(guò)shareUID方式可以和它跑在同一個(gè)進(jìn)程中 -
Android會(huì)為每個(gè)應(yīng)用分配唯一的一個(gè)UID仑乌,具有相同UID的應(yīng)用才能共享數(shù)據(jù)
image.png
獲取應(yīng)用UID的方法:(注意包名的替換)
fun getUid(context: Context): String? {
var uid = ""
try {
val pm: PackageManager = context.getPackageManager()
val ai = pm.getApplicationInfo("com.app.framworkdemo", PackageManager.GET_META_DATA)
uid = ai.uid.toString()
} catch (e: PackageManager.NameNotFoundException) {
e.printStackTrace()
}
return uid
}
- 驗(yàn)證: 首先創(chuàng)建application:
class ProcessApplication:Application() {
private val TAG="m_tag"
override fun onCreate() {
super.onCreate()
//獲取進(jìn)程Id
//獲取進(jìn)程Id
val pid = Process.myPid()
Log.d(TAG, "ProcessApplication onCreate pid is $pid") //根據(jù)進(jìn)程id獲取進(jìn)程名稱
val pName = getProcessName(this, pid)
Log.d(TAG, "onCreate:${pName} ")
}
fun getProcessName(cxt: Context, pid: Int): String? {
val am = cxt.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val runningApps = am.runningAppProcesses ?: return null
for (procInfo in runningApps) {
if (procInfo.pid == pid) {
return procInfo.processName
}
}
return null
}
}
- 驗(yàn)證: 其次創(chuàng)建不同進(jìn)程的activity:
第一個(gè)activity的進(jìn)程,android:process=":remote"
Log.d(TAG, "onCreate: ProcessOneActivity")
val pid = Process.myPid()
Log.d(TAG, "onCreate:ProcessOneActivity pid: $pid")
Log.d(TAG, "onCreate:ProcessOneActivity getUid: ${getUid(this)}")
binding.btnProcessOne.setOnClickListener {
val intent=Intent(this,ProcessTwoActivity::class.java)
intent.putExtra("process","進(jìn)程測(cè)試")
startActivity(intent)
}
第二個(gè)activity的進(jìn)程,android:process="com.process.two"
val process=intent.getStringExtra("process")
Log.d(TAG, "onCreate:ProcessTwoActivity $process")
val pid = Process.myPid()
Log.d(TAG, "onCreate: ProcessTwoActivity pid:$pid")
Log.d(TAG, "onCreate:ProcessTwoActivity getUid:${getUid(this)}")
測(cè)試結(jié)果:
截屏2023-03-20 15.42.37.png