症状:游戏过程中,按下Home键返回手机主菜单,再点击游戏图标试图返回游戏的时候屏幕黑的一片!

以前一直没在意只有结束线程在运行游戏,今天觉得改仔细琢磨一下这个问题了!

首先第一件事:打印Logo看看按下Home键后会调用哪些方法,结果如下:

游戏过程中按下Home后:

11-29 20:42:07.090: I/System.out(18835): Activity onPause...

11-29 20:42:14.190: I/System.out(18835): Activity  onStop...

11-29 20:42:14.260: I/System.out(18835): SurfaceView surfaceDestroyed...

可见SurfaceView 在返回手机主菜单的时候被销毁了,而我的SurfaceView 主线程是在构造方法里创建的

那么我们返回游戏的时候会调哪些方法呢?接着看Log:

11-29 20:48:06.940: I/System.out(18835): Activity  onRestart...

11-29 20:48:06.950: I/System.out(18835): Activity  onResume...

11-29 20:48:07.230: I/System.out(18835): SurfaceView  surfaceCreated...

11-29 20:48:07.240: I/System.out(18835): SurfaceView  surfaceChanged...

surfaceDestroyed 的时候线程已经退出了运行,这时再返回到游戏刷屏的线程就没了,任何绘制方法都没调用,所以你看到的只有黑漆漆的屏幕啦!

明白了运行原理我们就知道改怎么做啦!

首先创建线程放在 surfaceCreated ,并启动线程,

当 surfaceDestroyed 调用的时候,线程已经无效了,我们把线程对象设为null释放他,

然后不管怎么返回线程都会继续运行你的游戏也就不会中断了,来段简单的代码更具表达力度!

packagecom.game.view;

importAndroid.content.Context;

importandroid.graphics.Canvas;

importandroid.graphics.Paint;

importandroid.graphics.Paint.Style;

importandroid.graphics.Rect;

importandroid.view.SurfaceHolder;

importandroid.view.SurfaceHolder.Callback;

importandroid.view.SurfaceView;

publicclassTestViewextendsSurfaceViewimplementsCallback, Runnable{

publicstaticfinalintGAME_HEART =1000/30;//每秒刷新30次

publicstaticintscreenW, screenH;

privateThread thread;

privateSurfaceHolder holder;

privatePaint paint;

publicTestView(Context context) {

super(context);

// TODO Auto-generated constructor stub

holder = getHolder();

holder.addCallback(this);

paint =newPaint(Paint.ANTI_ALIAS_FLAG);// 无锯齿

paint.setStyle(Style.FILL);//填充样式

paint.setTextSize(16);// 字体大小

}

/**

* 执行游戏逻辑方法

*/

privatevoidupdate() {

}

/**

* 执行游戏绘制

*/

privateRect rect =newRect();

privatevoiddraw(){

Canvas canvas = holder.lockCanvas();

String text ="天使之翼的示例Demo";

//获取文本宽高

paint.getTextBounds(text,0, text.length(), rect);

//在屏幕中央位置显示文本

paint.setColor(0xfff000f0);//注意最高两位 ff 代表画笔透明度,不设置的画就是完全透明了,看不到任何效果

canvas.drawText(text,

(screenW - rect.width())/2,

screenH/2+ rect.height()/2,

paint);

holder.unlockCanvasAndPost(canvas);

}

@Override

publicvoidsurfaceCreated(SurfaceHolder holder) {

// TODO Auto-generated method stub

screenW = getWidth();

screenH = getHeight();

thread =newThread(this);

isRun =true;

thread.start();

}

@Override

publicvoidsurfaceChanged(SurfaceHolder holder,intformat,intwidth,intheight) {

// TODO Auto-generated method stub

//当屏幕旋转的时候重新获取屏幕宽高

screenW = getWidth();

screenH = getHeight();

}

@Override

publicvoidsurfaceDestroyed(SurfaceHolder holder) {

// TODO Auto-generated method stub

isRun =false;

thread =null;

}

privatebooleanisRun;//线程运行标志

privateintuseTime;//记录每次刷屏使用的时间

@Override

publicvoidrun() {

// TODO Auto-generated method stub

longstart, end;

while(isRun){

start = System.currentTimeMillis();

update();// 刷新界面上所有元素

draw();// 绘制界面元素

end = System.currentTimeMillis();

useTime = (int) (end - start);

if(useTime

try{

Thread.sleep(GAME_HEART - useTime);

}catch(InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

}

linux时间界面返回,Android开发教程:游戏过程中按Home键后返回游戏界面相关推荐

  1. 经典Android开发教程!面试字节跳动两轮后被完虐,附面试题答案

    前言 说起IT行业,大多数人脑海里反应出的第一个标签一定是"高薪",而说起程序员,大家更多想到的可能是: 秃顶.木讷.格子衫: 加班多.能赚钱.不花钱: 没对象-- 这难道就是传说 ...

  2. 【Android开发教程】一、基础概念

    Android操作系统 Android是一个基于Linux.使用java作为程序接口的操作系统.他提供了一些工具,比如编译器.调试器.还有他自己的仿真器(DVM - Dalvik Virtual Ma ...

  3. “.NET研究”【Android开发教程】一、基础概念

    Android操作系统 Android是一个基于Linux.使用java作为程序接口的操作系统.他提供了一些工具,比如编译器.调试器.还有他自己的仿真器(DVM - Dalvik Virtual Ma ...

  4. Unity3D For Android 开发教程【转http://game.ceeger.com/Unity/Doc/2011/Unity3D_For_Android.html】...

    Unity3D For Android 开发教程 Date:2011-08-01 04:33 我自认为抵挡诱惑的能力还是很强大的,关键的时候还能把持住自己.今天逛了一下南京的丹凤街,终于受不住Andr ...

  5. 微信小游戏开发教程-游戏实现3

    微信小游戏开发教程-游戏实现3 对象池 由于游戏过程中会创建很多临时对象,这些对象很快又不再使用,垃圾回收器也能帮我们主动回收这部分垃圾,但是回收时间不可控制,同时增大了创建对象的开销,所以我们使用对 ...

  6. Ubuntu Linux环境下的Android开发环境的配置

    在Android底层开发中需要用到的工具有:JDK6或以上版本:Eclipse3.4或以上版本:ADT;CDT;Android SDK:Android NDK:交叉编译环境:Linux内核源代码:An ...

  7. 【引用】安卓巴士精选Android开发教程

    精选Android开发教程--包括Android开发书籍,系列教程,优秀Android开源源码.同时也包括Android开发外包项目. 订阅地址:http://list.qq.com/cgi-bin/ ...

  8. android开发教程(一)——目录

    本教程中使用的环境: windows平台: c:\>winver linux平台: k@k-C410:/$ lsb_release -a No LSB modules are available ...

  9. Android开发教程JAVA基础(汇总)

    Android游戏开发视频教程(汇总) Android开发教程JAVA基础之Java 概述 Android开发教程JAVA基础之标示符.关键字1 Android开发教程JAVA基础之标示符.关键字2 ...

最新文章

  1. 双声道录制的混动波形信号
  2. CCNP精粹系列之十六--实现三层交换的vlan间通信和路由器的配合使用
  3. rest开发_REST 101开发人员专用
  4. 经典面试题:用typeof来判断对象的潜在陷阱
  5. bootstrap-table 列属性_bootstrap中table如何隐藏列?
  6. Centre Consortium 发布了USDC 智能合约 2.1 版本
  7. 利用线程池单线程下载网页信息
  8. php搜索功能代码实列,php记录搜索引擎关键词的代码示例
  9. 计算机应用基础试题及答案东师,计算机应用基础试题及答案东师
  10. impala hive随机抽样方法
  11. GreenPlum学习笔记:split_part与string_to_array字符截取
  12. USB3.0无法识别U盘解决办法
  13. 如何解决SQLServer已超过了锁请求超时时段
  14. android 8.0 展讯平台系统编译问题点
  15. 疫情之下裸辞后的一些感悟和面试心得
  16. Android判断当前系统使用的语言
  17. 电子设备雷击/浪涌测试
  18. java中 == 和 equels
  19. linux 2.4内核编译,linux 2.4内核编译详解
  20. 居然是 admin/123456,乌克兰这军方系统也是……

热门文章

  1. python的excell库_Python中使用第三方库xlrd来写入Excel文件示例
  2. css文字不被点击,css 让文字不被选中之-moz-user-select 属性介绍
  3. Windows server 2016远程桌面登录和修改3389端口
  4. App后台开发运维和架构实践学习总结(4)——APP的注册和登录功能设计
  5. 深入浅出 python epub_《机器学习从认知到实践(第2辑)(套装共3册,Python+TensorFlow)》epub+mobi+azw3...
  6. 九、Linux的网络配置
  7. Linux Fedora8 下安装 IE6
  8. 东部分布式光伏迎来发展高潮
  9. 小白使用ansible
  10. jQuery/Zepto的Bootstrap轮播图中图片自适应宽高并居中插件