美文网首页
android:process引发的血案

android:process引发的血案

作者: 萝卜小青菜丶 | 来源:发表于2020-03-19 16:01 被阅读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;
        }
    

    相关文章

      网友评论

          本文标题:android:process引发的血案

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