Android多进程问题

最近项目遇到一个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;

    }

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 进程启动过程 Android应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是Activit...
    Kevin_Junbaozi阅读 9,340评论 0 23
  • JAVA面试题 1、作用域public,private,protected,以及不写时的区别答:区别如下:作用域 ...
    JA尐白阅读 4,862评论 1 0
  • 什么是进程 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。 进程是一个“执行中的程序”。程序是一个没...
    MrMagicWang阅读 4,837评论 1 1
  • // com.adobe.flash.listen settings.gradle 定义项目包含那些模块app.i...
    zeromemcpy阅读 5,594评论 0 1
  • Android: 五种布局: FrameLayout 、 LinearLayout 、 AbsoluteLayou...
    apkcore阅读 3,085评论 0 1