Minor Android tweak...
Monkey Forums/Monkey Programming/Minor Android tweak...
| ||
| Hi, I've got a little tweak I'd like to apply to the Android target related to how suspend/resume works. It's a minor code change, but it's the kind of thing I suspect could potentially be highly sensitive to OS version, device manufacturer etc so I'd appreciate it if any Android devs could give it a go before I publish it! To apply, please replace this code at the bottom of targets/android/modules/native/androidgame.java...
@Override
public void onResume(){
super.onResume();
_view.onResume();
_game.ResumeGame();
}
@Override
public void onPause(){
super.onPause();
_game.SuspendGame();
_view.onPause();
}
...with this...
public void onWindowFocusChanged( boolean hasFocus ){
if( hasFocus ){
_view.onResume();
_game.ResumeGame();
}else{
_game.SuspendGame();
_view.onPause();
}
}
...run your apps and thrash suspend/resume behavior. This came about due to reports that Monkey apps were prematurely resuming at the unlock screen. This was noticeable if the app was playing audio, ie: you'd hear app audio while viewing the unlock screen! I suspect it's an OS version issue (my 2.2 LG does it;my 4.2.2 Nexus 7 doesn't) but the above is apparently the preferred way to resume games anyway and seems to work fine here. |
| ||
| Hmm... my app got rejected because of that reason. Interesting, will check it out! |
| ||
| FWIW ... I've added code to monitor the state of the lock-screen and only tell Monkey to resume when certain the lock-screen is not up/has been removed: NOTE: - These edits are to V66b (have not moved to a newer version yet) - Based on: http://thinkandroid.wordpress.com/2010/01/24/handling-screen-off-and-screen-on-intents/ Added near top of 'public class MonkeyGame extends Activity' in 'mojo.android.java':
private KeyguardManager mKeyguard;
private BroadcastReceiver mReceiver;
private boolean mScreenWasOff;
public class ScreenReceiver extends BroadcastReceiver
{
@Override
public void onReceive( Context context, Intent intent )
{
if( intent.getAction().equals( Intent.ACTION_SCREEN_OFF ) )
{
// screen has turned off
mScreenWasOff = true;
}
else if( intent.getAction().equals( Intent.ACTION_SCREEN_ON ) )
{
// screen has turned on ...
if( mKeyguard.inKeyguardRestrictedInputMode() )
{
// ... but lock-screen is up, do not signal resume
}
else
{
// ... and lock-screen is NOT up, signal resume
mScreenWasOff = false;
onResume();
}
}
else if( intent.getAction().equals(Intent.ACTION_USER_PRESENT ) )
{
// user has unlocked-screen, signal resume
mScreenWasOff = false;
onResume();
}
}
}
Added to bottom of 'onCreate': // setup for handling of screen off/on + lock-screen mKeyguard = (KeyguardManager)getSystemService( Context.KEYGUARD_SERVICE ); IntentFilter filter = new IntentFilter( Intent.ACTION_SCREEN_ON ); filter.addAction( Intent.ACTION_SCREEN_OFF ); filter.addAction( Intent.ACTION_USER_PRESENT ); mReceiver = new ScreenReceiver(); registerReceiver( mReceiver, filter ); Added to 'onResume':
if( app!=null ){
// If reason for 'onPause' was screen turning off, do not
// signal monkey-app to resume until lock-screen is removed
if( mScreenWasOff ) return;
app.InvokeOnResume();
}
Added to 'onDestroy':
if( mReceiver != null )
{
unregisterReceiver( mReceiver );
mReceiver = null;
}
|