package com.mints.goodmoney.utils

import android.app.ActivityManager
import android.content.Context

object SystemUtils {

    /**
     * 该方法必须在Activity或Service类内调用，一般情况下，可以在Activity的onCreate()方法中调用。
     * 由于应用每启动一个新的进程，就会调用一次Application的onCreate()方法，而个推SDK是一个独立的进程
     * ，因此如果在Application的onCreate()中调用intialize接口，会导致SDK初始化在一个应用中多次调用，
     * 所以不建议在Application继承类中调用个推SDK初始化接口。
     * 解释一下，每个[Android](http://lib.csdn.net/base/android "Android知识库")应用都要运行在一个虚拟机上，
     * ”个推“采用Service和后台服务器通信进行通信，于是和原本的Activity就形成了多进程。
     * 一个前台的应用进程，一个service后台进程，每个进程对应一个application对象，所以当应用配置了多个进程的时候，
     * application对象的onCreate方法就会执行多次，所以为了保证只初始化一次，
     * 就必须做出区分的处理的（“个推”中提到的在Activity或Service中初始，这种做法个人认为也是存在多次初始化的风险的）；
     * 进程名是通过Manifest.xml中的"android:process"属性设置的，因此可以在application的onCreate方法中通过pid获取processName，
     * 再做进一步的判断（跟android:process的值进行判断）使得相关初始化代码仅执行一次。
     */
    fun getProcessName(cxt: Context, pid: Int): String? {
        val am: ActivityManager = cxt.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
        val runningApps: List<ActivityManager.RunningAppProcessInfo> =
            am.runningAppProcesses
                ?: return null
        for (procInfo in runningApps) {
            if (procInfo.pid === pid) {
                return procInfo.processName
            }
        }
        return null
    }
}