关于android层面的调用问题

我自己用java实现了一套热更新的机制,正常情况下是没有任何问题的。
但是当接入了SDK后就出现了问题。
我首先描述下我热更新的基本交互。
在java端,我用线程池来维护下载
在lua端,我注册了一个局部函数到java中
java端通过

	public static void dispatchEvent(final Event event) {
		if (luaFunctionId < 0)
			return;
		Utils.act.runOnGLThread(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				
				String value = JSON.toJSONString(event);
				Cocos2dxLuaJavaBridge.callLuaFunctionWithString(luaFunctionId,
						value);
			}
		});

	}

这段代码来通知lua端,这个luaFunctionId就是lua注册到java中的;
而对于java端通知给lua的消息,lua端做的处理大多数是更新界面,例如进度条,文件下载大小等等。

问题出现的环境:
接入华为的一个SDK后,该SDK在主activity的oncreate函数中,会初始化该SDK,如果发现设备没有安装华为游戏中心,则会跳转到安装界面,安装完成后,回到游戏就报错了

Performing pause of activity that is not resumed

但是当本设备拥有华为应用中心的时候,也就是说,进入游戏后,不用跳转出去。这种情况是不会出问题的。

我的理解:
那么基于这种情况,我猜测可能是应为,当跳转到安装华为游戏中心界面的时候,游戏的主activity已经进入后台,但是因为线程池的下载仍在继续,所以不断的会调用上面的

dispatchEvent
``
函数,而Utils.act此时已经进入后台,调用其的话是否就会造成报错?
不过我对此又做过一个实验,在不安装任何sdk的情况下,当处于热更的时候,我将应用切入后台,切回之后,仍然是正确的。
这是不是说明了,即使游戏的主activity处于后台,仍然是可以调用它的runOnGLThread呢?
如果可以,那么为什么会出现报错的情况?

请先不要和我讨论为什么不用自带热更新的问题,谢谢

逻辑上来讲,我认为在java端创建线程下载,然后通过runOnGLThread通知lua端和引擎自带的在c++端创建下载,通过Director::getInstance()->getScheduler()->performFunctionInCocosThread通知lua端,好像并没有什么差别;
或者有人给我讲解下这两个的差别在什么地方吗

看runOnGLThread的源码,其实他是调用GLSurfaceView的queueEvent,你再往安卓源码看,其实还是有差别的。
差别在:
runOnGLThread: 会在一帧的最开始处理事件
performFunctionInCocosThread是在引擎更新scheduler的最后去判断是否有事件,有则执行。
所以从时间点看,这两者有一先一后的区别。

Performing pause of activity that is not resumed 这个日志出来后,我估计是不是你的Activity被重新创建了?
参考一下这个PR,AppActivity和Cocos2dxActivity中的修改

https://github.com/cocos-creator/cocos2d-x-lite/pull/819