AppProgressUtils.java 2.25 KB
Newer Older
1
package com.ydl.ydlcommon.utils;
konghaorui committed
2

konghaorui committed
3
import android.content.Context;
konghaorui committed
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
import android.text.TextUtils;

import com.yidianling.common.tools.LogUtil;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author yuanwai
 * @version 3.6.80
 * @描述:app 进程工具类
 * @Copyright Copyright (c) 2018
 * @Company 壹点灵
 * @date 2018/10/23
 */
public class AppProgressUtils {

    /***
     * 注:如果你的 APP 中有第三方的服务启动,请在初始化 SDK(EMClient.getInstance().init(applicationContext, options))方法的前面添加以下相关代码
     * (相应代码也可参考 Demo 的 application),使用 EaseUI 库的就不用理会这个。
     * @return
     */
konghaorui committed
26
    public static boolean isMainProcess(Context application) {
konghaorui committed
27 28 29 30 31 32 33 34 35 36 37 38 39
        String processAppName =  getProcessName(application);
        if(TextUtils.isEmpty(processAppName))
            return true;
        // 如果APP启用了远程的service,此application:onCreate会被调用2次
        // 为了防止环信SDK被初始化2次,加此判断会保证SDK被初始化1次
        // 默认的APP会在以包名为默认的process name下运行,如果查到的process name不是APP的process name就立即返回
        if (!processAppName.equalsIgnoreCase(application.getApplicationContext().getPackageName())) {
            // 则此application::onCreate 是被service 调用的,直接返回
            return false;
        }
        return true;
    }

konghaorui committed
40
    private static String getProcessName(Context app) {
konghaorui committed
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
        String processName = null;
        try {
            Field loadedApkField = app.getClass().getField("mLoadedApk");
            loadedApkField.setAccessible(true);
            Object loadedApk = loadedApkField.get(app);

            Field activityThreadField = loadedApk.getClass().getDeclaredField("mActivityThread");
            activityThreadField.setAccessible(true);
            Object activityThread = activityThreadField.get(loadedApk);

            Method getProcessName = activityThread.getClass().getDeclaredMethod("getProcessName");
            processName = (String) getProcessName.invoke(activityThread);
        } catch (Exception e) {
            LogUtil.e("AppProgressUtils " + e.getMessage());
        }
        return processName;
    }
}