是否可以从 JavaScriptInterface 扩展到 MainActivity 以避免非静态错误?



我有一个带有网络视图的活动。 当用户与 Web 视图交互时,它通过 JavaScriptInterface 执行此操作,以便应用程序和 Web 视图可以相互交互。 我相信该类默认情况下是静态的,所以我发现如果不扩展 MainActivity,就无法做太多事情。

public class JSInterface extends MainActivity {
private MainActivity mainActivity;
JSInterface(Context context, MainActivity mActivity) {
mainActivity = mActivity;
}
@JavascriptInterface
public void someMethod() {
mainActivityMethod(webViewData);
}
// other methods
}

在我的主活动中,我有:

WebView webView = findViewById(R.id.webView);
JSInterface JSInterface = new JSInterface(this, this);
//other methods called by JSInterface, e.g.
@Override
public void mainActivityMethod(String webViewData) {
// do something with data
}

因此,我发现通过从JSInterface扩展到MainActivity,我可以从MainActivity调用普通(非静态)方法,这是非常必要的。 如果我不将其扩展到 MainActivity,它似乎是一个静态类,并且在尝试调用 MainActivity 方法或引用任何非静态内容时出现此错误:

Non-static method someMethod() cannot be referenced from a static context.

它按原样工作,但我觉得这不是最好的方法。 我说的对吗? 做到这一点的"最佳"方法是什么?或者其他方式,最好是主观的。

我觉得

这不是最好的方法

永远不要创建Activity的子类,除非您打算以startActivity()开头。

做到这一点

的"最佳"方法是什么?

一种选择是简单的组合,摆脱不正确的继承:

public class JSInterface {
private MainActivity mainActivity;
JSInterface(MainActivity mActivity) {
mainActivity = mActivity;
}
@JavascriptInterface
public void someMethod() {
mainActivity.something(webViewData);
}
// other methods
}

另一个是嵌套类。在此示例活动中,Locater是我的GeoWebOne活动内部的嵌套类,因此Locater可以调用方法和访问GeoWebOne中的字段。简单的组合方法是一个更好的答案,尽管嵌套类可以工作。

最新更新