public class PhoneStatReceiver extends BroadcastReceiver {
boolean mIsComingCall = false;
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG,"onReceive():intent.getAction()="+intent.getAction());
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.i(TAG, "call OUT:" + phoneNumber);
} else if (intent.getAction().equals("android.intent.action.PHONE_STATE")) {
if(mGridLayer != null){
boolean mIsSlide = mGridLayer.inSlideShowMode();
Log.d(TAG,"onReceive():mIsSlide="+mIsSlide);
if(!mIsSlide){
return;
}
}else{
return;
}
TelephonyManager tm = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);
switch (tm.getCallState()) {
case TelephonyManager.CALL_STATE_RINGING:
mIsComingCall = true;
String incoming_number = intent.getStringExtra("incoming_number");
Log.i(TAG, "RINGING :" + incoming_number);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
if (mIsComingCall) {
Log.i(TAG, "incoming ACCEPT");
mHasPhoneCame = true;
}
break;
case TelephonyManager.CALL_STATE_IDLE:
if (mIsComingCall) {
Log.i(TAG, "incoming IDLE");
mHasPhoneCame = true;
}
break;
}
} else {
Log.i(TAG, "onreceive else");
}
}
}
回忆过去的事情,尤其是在很多不连续的时间中,要很好的描述清楚过去发生的事不是一件很简单的事情,好吧,我只是想到什么就说什么,现在说一个我在使用AndEngine中遇到的一个问题
很多情况下需要删除一个sprite,比如爆炸的动画效果结束之后要从场景中删去,或者物体被摧毁后要从画面中消失等等
在AndEngine中是很简单的一句
scene.detachChild(sprite);
如果你的游戏不是很激烈的话,那这样写基本上是没有任何问题的,但是,我在测试的时候总会出现一个问题,如果游戏的过程比较激烈的话,可能在非常短的时间之内会不断的添加/删除很多个sprite,这样就会有相当大的几率出现一个索引超出序列的exception
这个问题我之前已经修复了,而且也没有保存下来当时出错的stack trace,所以很抱歉不能提供在这里,总之是一个相当普通的java 索引超出序列的exception
很多时候问题出现的都比较奇怪,但在解决之后总会恍然大悟。经过多次测试和debug,终于发现了原因
AndEngine的运行机制是有两个核心线程,一个更新线程,一个处理线程,更新线程有一个while循环会不断的遍历当前所有可见元素(包括background, sprite, animate, particle)并将元素实时画在屏幕上,处理线程则负责进行运算操作,如果在处理线程中执行删除sprite的语句,而同时更新线程需要更新元素时,就会有索引超出序列的exception出现
所以,安全的做法是在更新线程做删除操作
this.runOnUpdateThread(new Runnable() { @Override public void run() { scene.detachChild(Sprite); } });
在AndEngine最新的实例中也有说明
/*Removing entities can only be done safely on the UpdateThread.
*Doing it while updating/drawing can
*cause an exception with a suddenly missing entity.
好吧,既然要开始,就从最开始说起
去年6月,从上大学起陪伴我7年的千锤百炼久经风雨的诺基亚手机,在一次意外坠地之后,终于伤重不治,永远的失去信号,宣布退休~
当时下了狠心,买了个联想的乐phone,这可真是割肉了~所以就想着怎么能挽回点~好吧,当时联想宣传的沸沸扬扬的,咱也当个开发者,开发软件吧~就这么开始了
第一个应用是一个非常非常非常简单的不能再简单的小应用,就是翻牌,翻到两张同样的就能够把牌翻过来,否则牌会又扣回去,每个人都玩过的,比较考验记忆力~
当时这个小游戏一共只做了1周不到,所以现在开来时非常简陋的,画面简单的一塌糊涂,现在回去再看代码,更是一塌糊涂。。。但个人感觉除去画面来讲,游戏性还是不错的。。。
以目前的市场客观状况看来,收费是不现实的,第一个helloworld也不合适,所以加了个广告,赚点早点费~~
之后又陆续的做了几个小应用,感觉在手机上的开发还有游戏比较有前途
工欲善其事,必先利其器,所以,在google上翻了很久,最终选定了一个游戏引擎,AndEngine,也算是相当著名了,Rukon停止开发了,而且Rukon的开发者也推荐AndEngine,还有libgdx,但是看了会,AndEngine要更好上手一些,我是初学者,就选他了~
记不起是去年的几月,可能是年底了,开始了自己酝酿已久的小项目~中间也经历过挫折,但也有克服,但是随着魔兽CTM的上线,和自己找不到明确的方向,二者的共同原因,使开发工作停滞了很久,直到一个月前,换了新工作,随着时间的增多,关于项目的具体思路也逐步理清,又重新拿起了搁置已久的项目,开始卖力工作起来~
后面,我会记录下开发中的点点滴滴,包括自己所犯的错误和走过的弯路,以便能够更好的提醒自己把事情做好,也可能给后来的开发者们一些帮助~