8

首先,我正在开发一个需要在应用程序不在前台时运行 JavaScript 的应用程序;问题似乎是,当应用程序进入后台/webview 与屏幕分离时,webview 的 onPause 方法被调用,每个文档执行以下操作:“暂停与此 WebView 及其关联的 DOM、插件相关的任何额外处理, JavaScript 等”

从我迄今为止发现的情况来看,我最好的选择似乎是使用反射来调用 webview 的“onResume”方法,该方法应该撤消所有这些进程暂停。在我当前的实现中,我得到了一个所述方法的实例,但是当调用时似乎什么都没有发生,因为我随后的 JavaScript 调用什么都不做(请注意,当我打开应用程序并在前台时,这有效)。

当您的应用程序在后台而不完全启动应用程序时,其他人看到我的代码存在问题或有运行 JavaScript 的解决方案吗?

推送消息说需要运行 JavaScript,因此发送意图以通知在后台运行的服务:

 Intent intent = new Intent( "some action" );
 intent.putExtra( "xtifyJson", xtifyJSON.toString() );
 context.sendBroadcast( intent );

在我的广播接收器的 onReceive 中,它位于始终运行的后台服务中:

final String stringArrayExtra = intent.getStringExtra( "xtifyJson" );
 if ( !Text.isNull( stringArrayExtra ) ) {

     new Handler( context.getMainLooper() ).post( new Runnable() {

          @Override
          public void run() {
             try {
                Log.d( "Hey Dev Guy", "Message received" );
                JavaScriptInterface javaScriptInterface = ( (SpecialApplication) getApplicationContext() ).getJavaScriptInterface();
                relectHiddenMethod( javaScriptInterface.getParentWebView(), "onResume" );
                javaScriptInterface.getParentWebView().resumeTimers();
                javaScriptInterface.callBackPushReceived( new JSONObject( stringArrayExtra ) );

          }
          catch (Exception e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
          }
       }
    } );

 }

reflectHiddenMethod 反射方法:

private void reflectHiddenMethod( final WebView webview, final String name ) {

    if ( webview != null ) {
        try {
            Method method = WebView.class.getMethod( name );
            Object invoke = method.invoke( webview );
        }
        catch (final Exception e) {
            e.printStackTrace();
        }
    }
}
4

1 回答 1

1

不幸的是,这行不通。WebView 是一个 UI 组件,因此需要附加到窗口。StackOverflow 上还有其他参考资料,例如:Android webview inside a service? .

一种可能性是研究替代 JavaScript 库来执行您的代码,而不需要 WebView,例如 Rhino、V8 或 spidermonkey。

但可能最好的解决方案是用 Java 实现您的推送消息。

于 2013-01-01T01:02:14.943 回答