Do not pause rendering when android activity loses focus (flutter/engine#4848)

* do not pause rendering when android view loses focus
This commit is contained in:
Jonah Williams 2018-04-12 11:00:31 -07:00 committed by GitHub
parent 573def2bee
commit 03e3c8bc39
7 changed files with 40 additions and 6 deletions

View File

@ -47,10 +47,14 @@ enum AppLifecycleState {
/// in the foreground inactive state. Apps transition to this state when in
/// a phone call, responding to a TouchID request, when entering the app
/// switcher or the control center, or when the UIViewController hosting the
/// Flutter app is transitioning. Apps in this state should assume that they
/// may be [paused] at any time.
/// Flutter app is transitioning.
///
/// On Android, this state is currently unused.
/// On Android, this corresponds to an app or the Flutter host view running
/// in the foreground inactive state. Apps transition to this state when
/// another activity is focused, such as a split-screen app, a phone call,
/// a picture-in-picture app, a system dialog, or another window.
///
/// Apps in this state should assume that they may be [paused] at any time.
inactive,
/// The application is not currently visible to the user, not responding to

View File

@ -99,6 +99,12 @@ public class FlutterActivity extends Activity implements FlutterView.Provider, P
super.onBackPressed();
}
}
@Override
protected void onStop() {
eventDelegate.onStop();
super.onStop();
}
@Override
protected void onPause() {

View File

@ -218,6 +218,11 @@ public final class FlutterActivityDelegate
}
}
@Override
public void onStop() {
flutterView.onStop();
}
@Override
public void onPostResume() {
if (flutterView != null) {

View File

@ -54,6 +54,11 @@ public interface FlutterActivityEvents
*/
void onDestroy();
/**
* @see android.app.Activity#onStop()
*/
void onStop();
/**
* Invoked when the activity has detected the user's press of the back key.
*

View File

@ -98,6 +98,13 @@ public class FlutterFragmentActivity
}
}
@Override
protected void onStop() {
eventDelegate.onStop();
super.onStop();
}
@Override
protected void onPause() {
super.onPause();

View File

@ -128,7 +128,14 @@ public class FlutterNativeView implements BinaryMessenger {
// Called by native to send us a platform message.
private void handlePlatformMessage(final String channel, byte[] message, final int replyId) {
assertAttached();
// The platform may not be attached immediately in certain cases where a new bundle is run -
// the native view is created in a separate thread. This mostly happens when the app restarts in dev
// mode when switching into split-screen mode. Preventing app restarts on layout and density
// changes will prevent this, and afterwards this can be changed back to an assert.
if (!isAttached()) {
Log.d(TAG, "PlatformView is not attached");
return;
}
BinaryMessageHandler handler = mMessageHandlers.get(channel);
if (handler != null) {
try {

View File

@ -267,7 +267,7 @@ public class FlutterView extends SurfaceView
}
public void onPause() {
mFlutterLifecycleChannel.send("AppLifecycleState.paused");
mFlutterLifecycleChannel.send("AppLifecycleState.inactive");
}
public void onPostResume() {
@ -278,7 +278,7 @@ public class FlutterView extends SurfaceView
}
public void onStop() {
mFlutterLifecycleChannel.send("AppLifecycleState.suspending");
mFlutterLifecycleChannel.send("AppLifecycleState.paused");
}
public void onMemoryPressure() {