cocos2dx-2.X前后台切换分析,基于android平台

摘自网上的android生命周期图:

cocos2dx-2.X前后台切换分析,基于android平台:
1、从后台进入前台
项目的activity一般继承自Cocos2dxActivity,看过activity生命周期的
都知道onCreate,onResume等方法,这些函数是activity生命周期中
最重要的函数,具体什么时候调用,可以查看相关资料。

        //刚进入游戏和游戏从后台回到前台会调用
	@Override
	protected void onResume() {
		super.onResume();
		Log.d(TAG, "onResume+++++++++++++++++++++++");
		Cocos2dxHelper.onResume();
		this.mGLSurfaceView.onResume(); --->>
	}

	this.mGLSurfaceView.onResume(); 方法--->>
        @Override
	public void onResume() {
		super.onResume();

		this.setRenderMode(RENDERMODE_CONTINUOUSLY);
		//使用queueEvent方法:主要是从UI线程切换到OpenGL渲染线程
		this.queueEvent(new Runnable() {
			@Override
			public void run() {

				Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleOnResume();
			}
		});
	}

	------>>>
	public void handleOnResume() {
	        //private static native void nativeOnResume();
		//调用了一个native方法,在C++端实现
		Cocos2dxRenderer.nativeOnResume();
	}
        //C++端的实现在Java_org_cocos2dx_lib_Cocos2dxRenderer.cpp文件中:
	JNIEXPORT void JNICALL Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeOnResume() {

		//做个标记(1)这里和我要在下面说的一点有关****
		if (CCDirector::sharedDirector()->getOpenGLView()) {
		    CCApplication::sharedApplication()->applicationWillEnterForeground();
		}
        }

	// this function will be called when the app is active again
	//进入前台,我们可以在这里做一些处理
	void AppDelegate::applicationWillEnterForeground()
	{
	    CCDirector::sharedDirector()->startAnimation();

	    SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
	}

2、 //从前台进入后台会调用过程
	@Override
	protected void onPause() {
		super.onPause();
		Log.d(TAG, "onPause+++++++++++++++++++++++");
		Cocos2dxHelper.onPause();
		this.mGLSurfaceView.onPause();
	}

        //this.mGLSurfaceView.onPause();--->>
	@Override
	public void onPause() {
		this.queueEvent(new Runnable() {
			@Override
			public void run() {
				Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleOnPause();
			}
		});

		this.setRenderMode(RENDERMODE_WHEN_DIRTY);

		//super.onPause();
	}

	---->>>mCocos2dxRenderer.handleOnPause:
	public void handleOnPause() {
		Cocos2dxRenderer.nativeOnPause();
	}
        ----->>>native方法,调用C++端的函数:
	private static native void nativeOnPause();

	//C++端的实现在Java_org_cocos2dx_lib_Cocos2dxRenderer.cpp文件中:
	  JNIEXPORT void JNICALL Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeOnPause() {
	  //进入后台
        CCApplication::sharedApplication()->applicationDidEnterBackground();

        CCNotificationCenter::sharedNotificationCenter()->postNotification(EVENT_COME_TO_BACKGROUND, NULL);
    }

    // This function will be called when the app is inactive. When comes a phone call,it's be invoked too
    //进入后台,我们可以在这里做一些处理。
	void AppDelegate::applicationDidEnterBackground()
	{
	    CCDirector::sharedDirector()->stopAnimation();

	    SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
	}

3、我的一点疑惑(已解决)
从activity生命周期中我们看到,在第一次进入游戏中时也会调用onResume方法,如果这样,那我们就不能
认为调用applicationWillEnterForeground方法的时机是从后台进入前台,如果这样我们在处理游戏从后台进入
前台时,就需要注意这个问题。其实,第一次进入游戏applicationWillEnterForeground方法是不会调用的,
我们可以不用管上面我说的那个问题。至于为什么,下面分析:
3.1、在activity中的onResume方法和Cocos2dxRenderer类中的onSurfaceCreated方法中加入log日志,看下
两个地方的执行顺序:
        @Override
	//onSurfaceCreated在surface创建时调用,在这里调用nativeInit方法进行一些初始化。
	//具体整个过程,可以查看cocos2dx启动过程相关的资料。
	public void onSurfaceCreated(final GL10 pGL10, final EGLConfig pEGLConfig) {
		Log.d("", "onSurfaceCreated+++++++++++");
		Cocos2dxRenderer.nativeInit(this.mScreenWidth, this.mScreenHeight);
		this.mLastTickInNanoSeconds = System.nanoTime();
	}

	--->>>
	void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv*  env, jobject thiz, jint w, jint h)
	{

	    if (!CCDirector::sharedDirector()->getOpenGLView())
	    {
	        //这里创建才创建CCEGLView,第二个标记(2)*****
		CCEGLView *view = CCEGLView::sharedOpenGLView();
		view->setFrameSize(w, h);

		AppDelegate *pAppDelegate = new AppDelegate();
		CCApplication::sharedApplication()->run();
	    }
	    else
	    {
	        //其实这里我有一点疑问?就是这个分支什么时候会被执行,我试了很多次,都没有看到什么时候执行。
		//有待以后学习。
		ccGLInvalidateStateCache();
		CCShaderCache::sharedShaderCache()->reloadDefaultShaders();
		ccDrawInit();
		CCTextureCache::reloadAllTextures();
		CCNotificationCenter::sharedNotificationCenter()->postNotification(EVENT_COME_TO_FOREGROUND, NULL);
		CCDirector::sharedDirector()->setGLDefaultValues();
	    }
	}

activity中的onResume方法和Cocos2dxRenderer类中的onSurfaceCreated方法的执行顺序:
看下面的输出信息就可以清楚的知道,onResume方法先执行而onSurfaceCreated方法后执行。
05-21 16:03:32.520: D/Cocos2dxActivity(7953): onResume+++++++++++++++++++++++
05-21 16:03:32.740: D/(7953): onSurfaceCreated+++++++++++

还记的我们做过的(1)和(2)两个标记吗?
标记(1):看到这里大家应该明白了吧,这里对是否进入applicationWillEnterForeground函数
加了一个判断CCDirector::sharedDirector()->getOpenGLView()即CCEGLView是否存在,
按照上面的说明在 onSurfaceCreated -->> Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit  -->>
--->> CCEGLView *view = CCEGLView::sharedOpenGLView() 即在nativeInit方法中才创建CCEGLView类的实例,
根据上面说的执行顺序,onResume方法在onSurfaceCreated方法之前执行,就意味着在nativeInit方法之前执行,
同样意味着第一次进入游戏时,因为CCDirector::sharedDirector()->getOpenGLView()方法返回NULL,因为还没有
实例化,所以applicationWillEnterForeground方法并不会执行。而当游戏从后台切换到前台时,
CCDirector::sharedDirector()->getOpenGLView()方法返回已经构造的实例变量,所以可以进入
applicationWillEnterForeground函数。
JNIEXPORT void JNICALL Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeOnResume() {

		//做个标记(1)这里和我要在下面说的一点有关****
		if (CCDirector::sharedDirector()->getOpenGLView()) {
		    CCApplication::sharedApplication()->applicationWillEnterForeground();
		}
        }
时间: 2024-11-11 19:22:08

cocos2dx-2.X前后台切换分析,基于android平台的相关文章

基于Android平台的会议室管理系统具体设计说明书

会议室管理系统具体设计说明书 第一部分  引言 1.编写目的 本说明对会议室管理系统项目的各模块.页面.脚本分别进行了实现层面上的要求和说明. 软件开发小组的产品实现成员应该阅读和參考本说明进行代码的编写.測试. 1.2 背景 说明: A.软件系统的名称:会议室管理系统 B. 任务提出者:内蒙古大学计算机学院 开发人员:魏晓蕾 本项目将实现基于Android平台的会议室管理系统的原型部分,而且在该原型的基础上进行功能的扩展和需求的界定,终于完毕的版本号将在全国范围内推广使用. 提供会议室管理功能

基于Android平台的i-jetty网站智能农业监控系统

基于android平台i-jetty网站的智能农业监控系统 摘要:传统的监控系统,一般是基于PC的有线通信传输,其有很多不足之处,如功耗较高.布线成本高.难度大,适应性差,可扩展性不强,增加新的通信线路需要再次布线施工,而且维护起来也比较麻烦,一旦线路出问题,需要繁琐的检查.而嵌入式Web监控系统是基于物联网技术,其无线通信技术具有成本低廉.适应性强.扩展性强.信息安全.使用维护简单等优点. 智能农业中,种植大棚是通过大棚内安装温湿度以及光照传感器,来对农作物的环境参数进行实时采集,由Web监控

Win7+VS2010+cocos2d-x 2.1 Beta3+Sqlite工程向android平台移植

Win7+VS2010+cocos2d-x 2.1 Beta3+Sqlite工程向android平台移植 题外话: 有时打开博客想写点什么时,心中感到有点酸楚,尽管语言不那么精简,或者说是准确,而且很可能文中的总结极不成熟,甚至还夹带些错误:但是,它们毕竟是自 己经过"痛苦"的挣扎后取得的一点成绩,于是,还是下决心记下来,一方面充实了自己尘封的笔记,另一方面也不敢独享-因为我看到有那么多的朋友把自己的心 血也无保留地奉献出来.或许,我的这一点一滴也能成为他们决战BUGS中的LITTLE

详解cocos2dx 3.0的release版本在android平台的签名过程

当您的游戏准备发布前,需要编译成为release版本,命令中需要增加 -m release,编译命令如下: cocos compile -p android -m release 在编译结束后,生成xxx_release_unsigned.apk,此时会提示进行签名,需要输入.keystore的路径. .keystore的生成方法: 使用keytool,命令如下: keytool -genkey -v -keystore my-release-key.keystore -alias alias_

基于Android 平台简易即时通讯的研究与设计[转]

摘要:论文简单介绍Android 平台的特性,主要阐述了基于Android 平台简易即时通讯(IM)的作用和功能以及实现方法.(复杂的通讯如引入视频音频等可以考虑AnyChat SDK~)关键词:Android 平台:即时通讯 (本文中图表点击附件即可见) 1 Android 平台简介Android 是Google 公司于2007年11月5日推出的手机操作系统,经过2年多的发展,Android平台在智能移动领域占有不小的份额,由Google为首的40 多家移动通信领域的领军企业组成开放手机联盟(

基于Android平台简易即时通讯的研究与设计

1 Android平台简介 Android是Google公司于2007年11月5日推出的手机操作系统,经过2年多的发展,Android平台在智能移动领域占有不小的份额,由Google为首的40多家移动通信领域的领军企业组成开放手机联盟(OHA).Google与运营商.设备制造商.开发商和其他第三方结成深层次的合作伙伴关系,希望通过建立标准化.开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统.正因如此,Android正在被越来越多的开发者和使用者所接受.近日,Google发言人Ant

基于Android平台开发的手电筒Light

基于Android平台开发的手电筒Light 1.     需求分析: 在现代社会中,手机的功能越来越完善,手电筒就是这些功能中必不可少的一种.当行走在漆黑的道路上,当你在黑暗狭小的地方寻找物品,当你在家中停电之时,如果你的手机拥有了手电筒的功能,那将为你带来莫大的方便.当然,它的用处不仅仅只是这样,有了这样一个方便携带的手电筒,在许多时候都是大有益处,因此,开发出了手电筒这一应用程序. 2.     开发环境: 1. JDK Ver: jdk-7u4-windows-x64.exe 2. My

基于Android平台的快递轨迹查询应用开发全程视频教程

课程讲师:欧楠课时数量:10(17节)课时用到技术:MenuDrawer.DbUtils.HttpUtils.讯飞语音识别涉及项目:基于Android平台的快递轨迹查询应用开发项目咨询QQ:1609173918 http://yunpan.cn/cVgILJtNYMcDB 访问密码 f885 目前Android平台移动应用开发正如火如荼的发展,智能手机和平板电脑的出货量正快速上升,人们正越来越习惯于在移动平台进行娱乐和各种操作.目前电子商务的发展使人们在每次网购之后都需要了解购买的商品的物流信息

基于Android平台的汽车租赁平台项目的数据库设计心得

我们团队的项目是基于Android平台的汽车租赁平台,其分为手机客户端与web后台管理系统,用以满足租车公司的业务需求,故数据库设计对于本项目显得尤为重要,我们团队数据库设计最开始用的是最原始的方式:Word手动输入,但随后随着数据库课程以及实验的学习,我们最后使用的PowerDesigner设计的数据库并生成了SQL文件,导入数据库完成的数据库最终设计与搭建,我们团队于第8周完成了数据库的搭建. 数据库设计中,数据库要严格与项目需求相联系,同时保证数据库数据完整.正确.安全以及数据处理的高效与