app使用期间,前台Activity经常被其他的可视组件遮挡,进入paused状态,例如一个对话框弹出时,只要Activity部分可见,但没获得焦点,就处在paused状态
然而,一旦Activity完全不可见,就处在stopped状态
当Activity进入paused状态时,系统调用onPause()方法,其中你可以停止一些任务,或者保存一些数据防止用户其后又退出,如果用户又返回,可以调用onResume()方法脱离paused状态
Note: 当Activity接到一个onPause()调用时,可能预示着用户是暂时离开,还会回来,也通常是用户离开时的第一个提示
Pause你的Activity当Activity接到一个onPause()调用,技术上意味着Activity部分可见,但通常表示用户离开这个Activity,即将进入stopped状态,在onPause()中,通常要做一下事情:
- 停止动画或者其他正在进行的耗费CPU的动作
- 提交未保存的变化,但是只有在用户认为数据应该被保存的时候,例如邮件的草稿
- 释放系统资源,例如broadcast receivers, 传感器句柄(例如GPS),或者其他影响电池电量而用户有不用的资源
例如,使用照相机,在onPause()中就可以关掉
@Override public void onPause() { super.onPause(); // Always call the superclass method first // Release the Camera because we don't need it when paused // and other activities might need to use it. if (mCamera != null) { mCamera.release() mCamera = null; } }
通常,不应该在onPause()中关闭CPU敏感的资源,像database connection,会延缓Activity之间的转换,他们最好在onStop()中实现
如果Activity将要进入Stopped状态,在onPause()中就要相对简单的完成操作以使用户能尽快转到下一个Activity,免得影响用户体验
Note: Activity处于paused状态时,Activity的实例还在内存中存在,回到Resumed状态时不需要重新初始化
Resume你的Activity从paused状态到resumed状态调用onResume()
只要Activity到前台就要调用onResume()方法,包括第一次创建Activity,所以在onRe()方法中要初始化onPause()中释放的组件和其他每次进入resumed状态要实现的动作,例如动画或者只有在获得用户焦点才需要初始化的组件
例如,下面的例子初始化在onPause()中释放的Carema
@Override public void onResume() { super.onResume(); // Always call the superclass method first // Get the Camera instance as the activity achieves full user focus if (mCamera == null) { initializeCamera(); // Local method to handle camera init } }
我现在手头有一份基于MFC架构的C++项目。
目标是:把部分功能代码移植到安卓上。
目前进展:
注:非指针类型的数据的迁移十分简单,不赘述。
1. struct 类型内成员变量指针。
例子:struct Node
{ /// it seems that the member order should be placed according to access frequency NLinkFlowType m_nCap[NeighborhoodSize]; TLinkFlowType m_tCap; // if m_tCap > 0, then residual capacity of edge source->node is m_tCap // if m_tCap < 0, then residual capacity of edge node->sink is -m_tCap unsigned int m_ts; /// time stamp unsigned int m_dist; /// distance to the terminal unsigned int m_parent : 4; unsigned int m_tree : 1; // 0 = source, 1 = sink (if parent!=PARENT_FREE) unsigned int m_isDumb: 1; /// whether participating in the maxflow Node* m_next; // queue of active nodes NLinkFlowType m_nCapOld[3]; /// for recording the capacity in the modified residual graph NLinkFlowType m_nCapSub[3]; /// for sub-division }; /// struct Node方案:将struct类型转换为class类型。其中的C++的指针队列部分就忽略掉。
2. 类中成员变量&函数中成员变量指针
方案:转换为class类型。
3. 函数指针
例子:typedef bool (*ProgressCallback)( int numSoFar, void* callbackData );
方案:目前无。求指教。
4. 形式参数& 函数返回值
例子: Node* GetNeib(Node* p, int e)
{
return (Node*)((char*)p + m_nodeShifts[e]);
}
方案: 转换为class类型。
5. void指针
例子:
void* callbackData
GridGraph8::GridGraph8(int sizeX, int sizeY, ProgressCallback abortCallback, void* callbackData) : m_nodes(NULL), m_pAuxNodeInfo(NULL), m_threadsNum(1), m_abortCallback(abortCallback), m_callbackData(callbackData) { Allocate(sizeX, sizeY); }
方案:目前无。求指教。
我看网上有说JAVA中用JNI调用C++之类。但是我自己没有做过。不敢尝试,时间也不那么允许。好久没有给导师提交阶段进展报告了。
目前整个学习笔记的版本是cocos2d-x 2.1.0beta3。
准备开始做cocos2d-x的跨平台游戏。因为主力做的还是android,所以趁刚开始先搞定win32版本到android的移植步骤吧。
第一步:cocos2d-x+vs环境
这个很容易,跟着官网教程cn.cocos2d-x.org就可以搞定。
我这里再简单说一下。
1.从http://cocos2d-x.org/projects/cocos2d-x/wiki/Download下载最新版本的cocos2d-2.1beta3-x-2.1.0 @ Dec 05 2012。
我下载后解压到了E:\cocos2d-2.1下。
然后找一个vs来安装,安装后点击cocos2d-2.1目录当中的cocos2d-win32-vc2010.sln解决方案。我安装的是vs2010,所以用的是2010的解决方案。顺便说下我的vs2010安装了vxa插件和vsvim插件,有兴趣的朋友可以去看下,这里就不说了。
用vs2010打开解决方案以后点击生成解决方案
这个要花一些时间,慢慢等吧。
生成完成以后,可以直接启动HelloCpp看是否成功。
好的,出现这个图说明已经安装成功了。
接下来试试创建自己的Hello项目。
先点击目录下的install-templates-msvc.bat,这样就会生成模板
然后回到vs2010,点解决方案->添加->新建项目,
一路点确定,这里我们不需要box2d就不点了。
ok建立成功。
接着直接点击这个项目启动新实例就可以看到成果了(为了方便可以把它设置为启动项目)。
应该可以顺利成功。
然后我们进源码来随便改一下HelloworldScene.cpp
把hello world改成hello android
运行
ok没有问题。
好了接下来才是重点。
第二步:android开发环境
1.安装eclipse+cdt+adt
以前的教程里面需要先下载eclipse,安装cdt,安装adt之类的,不过现在已经没有这个必要了。
我们先来到android的开发者官网,找到bundle。http://developer.android.com/sdk/installing/bundle.html
是的,伟大的谷歌大神告诉我们,现在可以使用集成版的IDE了。
所以还等什么呢,赶快去下载吧。
在这里找到你要的版本。
下载后解压。我是解压到了e:\android下面。
解压完成后是这样的
直接打开eclipse
是的,cdt这些东西已经装好,也就不需要我们再麻烦配置了。
接下来有一条要再说一下的就是这里的sdk其实不是很全,可以点击window->android sdk manager选择版本下载安装。
我这里装的是4.2的api
2.安装ndk
这个也简单,找到ndk下载后解压即可。
ndk下载的地址http://developer.android.com/tools/sdk/ndk/index.html#Installing
记得下载windows版本的!不要以为cygwin是类似unix环境就用linux版,你会后悔的(好吧我就是这里中招了= =不过搞不好也只有我这种刚从linux下转回windows的会中招也说不定)
我下载后解压到了e:\ndk目录下
3.安装cgywin
http://www.cygwin.com
在这里下载
下载以后安装就不用多说了,选择install from internet,接着选择一个根目录
接着点下一步下一步
在这里选择想要安装的软件,autoconf2.1、automake1.10、binutils、gcc-core、gcc- , g++、gcc4-core、gcc4-g++、gdb、pcre、pcre-devel、gawk、make
大概这些就行了。
可以把setup.exe放到cgywin的根目录下,这样方便以后装新的软件(重新点击setup.exe选择新的就可以了)
这是一个类linux环境,装好以后可以进去试试。
注意这个要进行配置
编辑.bashrc
在底部加入
# 让ls和dir命令显示中文和颜色
export LESSCHARSET=latin1
alias ls='ls --show-control-chars -hF --color=tty'
alias dir='dir -N --color'
# 设置为中文环境,使提示成为中文
export LANG="zh_CN.GBK"
当然,cygwin的中文支持真的很糟糕,这样做以后有时候还是会出现乱码。谋事在人成事在天就这样吧= =
接着还要编辑一下.bash_profile,环境变量放在这里。(其实放在.bashrc也可以,不过这里就这样吧)
添加下面这些内容
export NDK_ROOT="/cygdrive/e/android/ndk"
export SDK_ROOT="/cygdrive/e/android/sdk"
export PATH=$PATH:NDK_ROOT
export PATH=$PATH:SDK_ROOT
export COCOS2DX_ROOT="/cygdrive/e/cocos2d-2.1"
export NDK_TOOLCHAIN_VERSION=4.7
# adb PATH
export PATH=$PATH:/cygdrive/e/android/sdk/platform-tools/