美文网首页
android 多进程开发的基本使用

android 多进程开发的基本使用

作者: 别看后面有人 | 来源:发表于2023-03-19 15:43 被阅读0次
  • 现在大型的app都采用多个进程来分担单个进程的压力,在清单文件中配置android:process属性,确定是否在同一个进程中,如图中有2个不同的进程:
  • 进程名以“:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程当中
    不以“:”开头的进程属于全局进程,其他应用通过shareUID方式可以和它跑在同一个进程中
  • Android会为每个应用分配唯一的一个UID,具有相同UID的应用才能共享数据


    image.png

    获取应用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
    }
  1. 验证: 首先创建application:
class ProcessApplication:Application() {
    private val TAG="m_tag"
    override fun onCreate() {
        super.onCreate()
        //获取进程Id
        //获取进程Id
        val pid = Process.myPid()
        Log.d(TAG, "ProcessApplication onCreate pid is $pid") //根据进程id获取进程名称
        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
    }
}
  1. 验证: 其次创建不同进程的activity:
    第一个activity的进程,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","进程测试")
            startActivity(intent)
        }

第二个activity的进程,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)}")

测试结果:


截屏2023-03-20 15.42.37.png

相关文章

网友评论

      本文标题:android 多进程开发的基本使用

      本文链接:https://www.haomeiwen.com/subject/pvryrdtx.html