最近项目遇到一个bug,App在运行的过程中会使用到三方的SDK或者开源库解决某些特定业务需求,一般这种情况第三方库会单开一个Service进行后台操作,为了保证主进程不受干扰这种Service会单开一个子进程,这个子进程在启动时我们的Application的onCreate()方法会再执行一次,由于很多人(比如我)在Application初始化的时候会初始化很多基础数据和服务(Service),还有在Application中会实例一个单例的getApplicationContext,如果在子进程运行过程中你再去获取getApplicationContext作为你的主进程的上下文,就有可能会导致你的代码运行在子进程中,比如说我在这个过程中使用了EventBus去发消息给我的Service,这时候由于我的Service是在主进程中进行启动并注册的监听,所以就导致 EventBus : No subscribers registered for event class,这是由于我在子进程运行期间去获取的全局上下文是子进程所导致的,解决办法就是在Application的onCreate()中进行主进程的校验,保证你的getApplicationContext获取到上下文永远都是主进程的。
//判断进程名,保证只有主进程运行
if (!TextUtils.isEmpty(processName) &&processName.equals(this.getPackageName())) {
//初始化你的基础服务及数据
}
获取主进程方法
public static StringgetProcessName() {
try {
File file =new File("/proc/" + android.os.Process.myPid() +"/" +"cmdline");
BufferedReader mBufferedReader =new BufferedReader(new FileReader(file));
String processName = mBufferedReader.readLine().trim();
mBufferedReader.close();
return processName;
}catch (Exception e) {
e.printStackTrace();
return null;
}
}