Android多进程时Application中onCreate执行多次

来源:互联网 发布:数据库恢复模式设置 编辑:程序博客网 时间:2024/05/24 16:13

  自己写了一个音视频通讯的SDK,由于做了双进程保活,造成很多代码会执行两次,在日志从发现一个在主进程,另一个在守护进程,逐步寻找,最后发现是Application的OnCreate方法会执行两次。原来是多进程的缘故,导致了Application创建了两次,每个进程都会有一个Application,于是就找到以下解决方法:


    主要就是:android:process这个属性,这个属性有什么作用?

    在Android的帮助文档中我们可以了解到,一般情况下一个服务没有自己独立的进程,它一般是作为一个线程运行于它所在的应用的进程中。但是也有例外,Android声明文件中的android:process属性却可以为任意组件包括应用指定进程,换句话说,通过在声明文件中设置android:process属性,我们可以让组件(例如Activity, Service等)和应用(Application)创建并运行于我们指定的进程中。 


<manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.doormaster.doorphone" >//包名<activity android:name=".DMVPhoneService"    android:process=":VPhoneProcess"/>//为service开启一个进程

    上面就为这个DMVPhoneService单独开启了一个进程com.doormaster.doorphone:VPhoneProcess,前面加:,代表是把这个名字附加到你的包所运行的标准进程名字的后面作为新的进程名称(只不过这个进程为该应用私用,其他应用不能共享)

    还有一种,单独命名的进程,以小写字母开头,如下:


<activity android:name=".KeepAliveService"    android:process="com.doormaster.alive"/>//为service开启一个不同于应用包名的进程


    这个进程将以com.doormaster.alive这个名字命名的运行于全局的进程中(该进程就可以让不同应用中的各种组件可以共享一个进程)。

解决多进程次执行多次onCreate()

如果应用中采用多进程方式,oncreate方法会执行多次,根据不同的进程名字进行不同的初始化。应用判断进程名字进行单独初始化,这要就可以利用进程名根据具体需求,应该加载哪些资源,执行哪些具体逻辑了。

@Override    public void onCreate() {        super.onCreate();        String processName = getProcessName(this);        if (processName!= null) {            if(processName.equals("com.doormaster.doorphone")){                //初始化com.doormaster.doorphone以包名为进程名,项目默认的进程            } else if(processName.equals("com.doormaster.doorphone:VPhoneProcess")){                //初始化com.doormaster.doorphone:VPhoneProcess进程            }else if(processName.equals("com.doormaster.alive")){                //初始化com.doormaster.alive进程            }else{            }        }    }    private String getProcessName(Context context) {        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);        List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();        if (runningApps == null) {            return null;        }        for (ActivityManager.RunningAppProcessInfo proInfo : runningApps) {            if (proInfo.pid == android.os.Process.myPid()) {                if (proInfo.processName != null) {                    return proInfo.processName;                }            }        }        return null;    }


方法总结:这里有两点需要注意

第一就是找错的方法,一定要逐个排查,多用debug调试;

第二就是 在对应的把它们的值和对应的进程在日志中输出,一定要仔细;

第三就是 学会记录和总结,把这个知识点总结并记录下来。


以上如有错误之处,敬请指出纠正,或者需要指导帮忙,可以留言!

CSDN博客:http://blog.csdn.net/kebiiii

阅读全文
1 0
原创粉丝点击