android:process引发的血案

2020-03-19  本文已影响0人  萝卜小青菜丶

首先贴一段比较常用的代码,相信有一定开发经验的人,都能看明白这个配置是做了什么。

<service
        android:name=".service.LogService"
        android:exported="true"
        android:process=":LogService" />

上面配置的service是在另一个进程中启动,但这样会有一个问题,开启多进程会使Application运行两次,下面做个试验,继承Application,在oncreate方法中打log并运行程序

public class MyApplication extends Application {
    private static final String TAG = "jf";
    @Override
    public void onCreate() {
        super.onCreate();
        int pid = android.os.Process.myPid();
        Log.i(TAG, "MyApplication is oncreate====="+"pid="+pid);
    }

在log中发现我们开启的两个进程都会执行oncreate方法。现在很多人都习惯在Application中做初始化操作以及数据的传递操作,显然我也见这么干过的,把库初始化了两次。
当然,知道问题就好解决,方法就是得到每个进程的名称,如果进程的名称和我们应用的进程名称相同则做我们应用的操作,如果不是则做其他进程的操作,以下方法仅供参考:

    @Override
    public void onCreate() {
        super.onCreate();
        // 获取当前包名
        String packageName = getPackageName();
        // 获取当前进程名
        String processName = getProcessName(android.os.Process.myPid());
        if (processName == null || processName.equals(packageName)) {
            //todo:
        }
    }

    /**
     * 获取进程号对应的进程名
     *
     * @param pid 进程号
     * @return 进程名
     */
    private static String getProcessName(int pid) {
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader("/proc/" + pid + "/cmdline"));
            String processName = reader.readLine();
            if (!TextUtils.isEmpty(processName)) {
                processName = processName.trim();
            }
            return processName;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException exception) {
                exception.printStackTrace();
            }
        }
        return null;
    }
上一篇下一篇

猜你喜欢

热点阅读