因为开发moto EM30手机上的东西,发现了很BT的中断相应。(1)按下红色键(关机键)时触发javax.microedition.lcdui.Canvas.hidenotify()事件,当返回程序时会触javax.microedition.midlet.MIDlet.pauseApp()事件.当选择隐藏程序时会先触发pauseApp然后立即执行shownotify.(2)打电话时,当有电话铃声想起时触发了javax.microedition.lcdui.Canvas.hidenotify(),如果在此之前有声音正在播放,电话铃声会导致Player对象异常,在public void playerUpdate(Player player, String event, Object data){if(event.equals(PlayerListener.DEVICE_UNAVAILABLE) || event.equals(PlayerListener.ERROR)){...}}电话中断回来,虽然声音在播放,但player确没有声音。所以当有此类情况时最好时记录下原来player的声音各个值,如播放到那个帧,播放器控制开关的值。中断回来时相应了shownotify()同时重新load原来的声音文件并设置开始点播放。(3)有短信来到时不会触发hidenotify()也不会触发shownotify(),但时短信音也会时原来正在播放的player出现异常。处理方式就比较麻烦。我们采用了三个值确定是否时短信影响了player.在hideNotify(){ishidenotify = true; hideCout =1;}和监听中当出现PlayerListener.DEVICE_UNAVAILABLE||PlayerListener.ERROR)时设置isBreakSound = true; 当if(ns.isSoundBreak && !ishidenotify && hideCount !=1){ ... hideCount =0;}表示短信事件。为什么要用三个值而不用两个ns.isSoundBreak && !ishidenotify呢?由于打电话时也会触发这个事件,如果当电话中断返回过快时shownotify中有ishidenotify =false;语句会快速执行,导致也会进入我们的短信判断部分。如果这两段中都有声音重新加载播放,声音就会有断续(卡)的现象。-------------------------moto机器对声音的关闭也不及时。如果在player刚结束准备循环准备播放时执行隐藏应用程序,你有可能会发现隐藏后还有声音播放,即使你在pauseApp中有player.close()语句也不好使。moto对所有的close()语句执行都很慢。你不用那更不可以(十分郁闷,如果没有close()你重新创建player会导致多个系统中会有很多个player那是你就麻烦啦)-------------------------建议: moto的声音判断和中断处理最好在Runnable的run函数中执行会好一点。声音关闭不及时我就用线程一直关,直到死掉(哈哈哈)我的处理----》public void logicRun() { try{ if(!midlet.isPause) { if (gamestate == Gamescreen.STATE_HELP || gamestate == Gamescreen.STATE_ABOUT ) {/* if(ns.isSoundBreak){ //如果在此状态因为打电话把声音关闭,且造成重新showHelp()或showAbout() if(midlet.isOpened)ns.ok = true ; ns.isSoundBreak = false; }*/ }else{ if (gamestate >= Gamescreen.STATE_FRONTPAGE) { if(ns.ok) {//midlet.soundState if(ns.player == null){ soundOn(); }else{ if(ns.player.getState()==Player.UNREALIZED){ ns.player.realize(); } if(ns.player.getState()==Player.REALIZED){ ns.player.prefetch(); } if(ns.player.getState()==Player.PREFETCHED){ ns.player.start(); } if(ns.player.getState()==Player.CLOSED){ } if(ns.player.getState()==Player.STARTED) { // ns.player.start(); } }//如果收到短信或者打电话有提示因,会造成player异常,并被player监听器捕获//打电话时会触发hidenotify,且电话中断后返回会触发shownotify//短信中断后返回不会触发ishidenotify //hideCount==1 确定不是因为打电话时hidenotify和shownotify处理过快而导致进入该段 if(ns.isSoundBreak && !ishidenotify && hideCount !=1){ if(ns.isSMSBackDevice){ showMsg = "the sms back ok"; } if(ns.player == null){ soundOn(); }else{ if(ns.player.getState()==Player.UNREALIZED){ ns.player.realize(); } if(ns.player.getState()==Player.REALIZED){ ns.player.prefetch(); } if(ns.player.getState()==Player.PREFETCHED){ ns.player.start(); } if(ns.player.getState()==Player.CLOSED){ } if(ns.player.getState()==Player.STARTED) { // ns.player.start(); } } }//end sms process hideCount =0; } } //} } }else{//先相应pauseApp()然后再调用此处 soundOff(); } }catch(Exception e) { return; } } public int hideCount = 0; public void hideNotify() {//Midlet.pauseApp() hideCount = 1; //showMsg ="hideNotify!"; if (gamestate == Gamescreen.STATE_HELP || gamestate == Gamescreen.STATE_ABOUT ) { //if(selectedItem!=1 ||selectedItem !=2) }else{ if (gamestate >= Gamescreen.STATE_FRONTPAGE) { //打电话也触 //按下红色键时触发 //midlet.pauseApp(); IncomeApp(); } } } public static boolean ishidenotify = false; //public static boolean soundok1 = false; public void IncomeApp() { Gamescreen.showMsg = Gamescreen.showMsg+"IncomeApp() !"; //midlet.isPause = true; ishidenotify = true; //soundok1 = ns.ok; midlet.soundState = ns.ok; soundOff(); if (ns.ok) { rank.addData("0", 1); } else { rank.addData("1", 1); } } public int showCount = 0; public void showNotify() { showCount++; //如果先从staApp中的ispuase段执行后将不会返回到此处执行, //因为没有再次调用hidenotify的动作所以无需shownotify ErrCode=ErrCode+"#"; if(!midlet.isPause) { Gamescreen.showMsg = "!->isPause shownotify"; if (gamestate == Gamescreen.STATE_HELP || gamestate == Gamescreen.STATE_ABOUT ) { if(ns.isSoundBreak){ //如果在此状态因为打电话把声音关闭,且造成重新showHelp()或showAbout() if(midlet.isOpened)ns.ok = true ; ns.isSoundBreak = false; } }else{ if(ishidenotify){ if(midlet.soundState) { ns.ok = true; ns.player = null; //soundOn(); showMsg = "33333333"; if (ns.ok) { rank.addData("0", 1); } else { rank.addData("1", 1); } } ishidenotify = false; }else{ } //} } }else{//先相应pauseApp()然后再调用此处 soundOff(); } display.setCurrent(this); repaint(); }//===========midlet======================//
public void startApp() {
if(isPause){ isPause = false;}else{ //原来你写的东西 }}
public void startApp() {
if(isPause){ isPause = false;}else{ //原来你写的东西 }}
protected void pauseApp() { isPause = true;//Jimmy gai_
}
}