android:process引发的血案

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

<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;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容