活动销毁时如何恢复MethodChannel.result?

时间:2018-09-27 19:39:30

标签: android flutter

我正在调查Flutter是否是构建需要视频播放的应用程序的好技术。

到目前为止,我对当前的视频播放插件不满意,并且我现在没有时间编写自己的插件。

因此,我正在考虑将本机视图用于需要播放器的应用程序部分。

我正在按照示例进行操作 https://github.com/flutter/flutter/tree/master/examples/platform_view

但是,我无法从本机android返回到flutter视图。 问题在于MainActivity.java保留了MethodChannel.result的引用,然后通过StartActivityForResult呈现了一个新的活动(CountActivity.java)。但是,当我返回MainActivity时,对结果的引用可能会消失。

我对Android Activity生命周期的理解是,如果一项活动不在前台,那么OS可能(并且经常会)销毁它。我知道我应该允许这种情况发生,而不是尝试使活动保持活跃。相反,我应该只提供通过OnSaveInstanceState保存必要数据并恢​​复到OnRestoreInstanceState的方法。

如果有人可以帮助我找出解决方法?我之前已经做过简单的数据,可序列化和可打包的内容。但是我不知道如何保存该接口对象。

目前,如果MainActivity由于空引用而被破坏,则应用程序将崩溃。 我知道关于将结果发送到新活动的问题也存在。 How do you pass the MethodChannel Result to a new Activity?

但是他们没有解决我关心的问题。

这是相关代码

package io.flutter.examples.platform_view;

import android.content.Intent;
import android.os.Bundle;

import io.flutter.plugins.GeneratedPluginRegistrant;

import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;

public class MainActivity extends FlutterActivity {
private static final String CHANNEL = "samples.flutter.io/platform_view";
private static final String METHOD_SWITCH_VIEW = "switchView";
private static final int COUNT_REQUEST = 1;

private MethodChannel.Result result;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);

    new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
            new MethodChannel.MethodCallHandler() {
            @Override
            public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
                MainActivity.this.result = result;
                int count = methodCall.arguments();
                if (methodCall.method.equals(METHOD_SWITCH_VIEW)) {
                onLaunchFullScreen(count);
                } else {
                result.notImplemented();
                }
            }
            }
    );
}

private void onLaunchFullScreen(int count) {
    Intent fullScreenIntent = new Intent(this, CountActivity.class);
    fullScreenIntent.putExtra(CountActivity.EXTRA_COUNTER, count);
    startActivityForResult(fullScreenIntent, COUNT_REQUEST);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == COUNT_REQUEST) {
    if (resultCode == RESULT_OK) {
        result.success(data.getIntExtra(CountActivity.EXTRA_COUNTER, 0));
    } else {
        result.error("ACTIVITY_FAILURE", "Failed while launching activity", null);
    }
    }
}
}

0 个答案:

没有答案