KJava的JVM实现有很多,Motorola在早期的V系列和Tripple里面用的好像是差不多的,后来有一部分使用了Linux+Java的实现,SonyEricsson的JVM是自己的平台,而Nokia的S40和S60系列也都各自用了一套。
Sun的规范虽然说明了正常情况下JVM应当实现的API,以及事件处理的顺序,但是并没有规定JVM应当如何处理一些特殊的情况——例如,startApp和pauseApp。最典型的例子就是手机对于下列情况的处理:
- incoming call
- receiving a message
- power-save mode
来电,一般的手机都会在来电的时候调用Canvas的hideNotify()方法,并在来电结束后提示用户是否继续程序,如果是,则调用Canvas的showNotify()方法继续。在这种情况下,有的startApp和pauseApp()的调用不是每个机型都实现的,甚至有的手机连hideNotify()和showNotify()都不实现。
根据我的经验,绝大多数手机都不会暂停应用程序的执行,可能有铃声或是图标闪动之类的提示。
节能模式的一个特征就是:如果用户在一段时间内没有对手机进行操作,那么手机就会降低能耗——例如,关闭背景灯,或是关闭屏幕。有的手机在这种情况下也会让JVM挂起正在执行的线程。
今天遇到了一个bug,就是由于power-save mode引起的——Motorola的E680/A780在进入节能模式之后会将MIDlet的线程挂起,而一般的游戏程序都会在主线程的run()中计算tick所花费的时间(可以计算FPS或是帮助计时)。由于线程挂起之前计算了一个时间,线程恢复执行之后获得了另一个时间,二者之间的差值非常大,这种情况下,应当作为例外处理,而不能当作正常值。
评论