【问题标题】:Black webview onResume黑色 webview onResume
【发布时间】:2014-09-08 10:18:26
【问题描述】:

我的应用中有一个 WebView,我希望它永远运行。

当我返回我的应用时(onResume),WebView 是黑屏...

我尝试了多种解决方案和布局。我正在使用函数 setContentView(w);

添加 WebView

在第一次运行时它运行良好。当我按下主页按钮时,WebView 仍在运行(console.log(),来自 javascript 提供反馈)。回到应用程序,我看到一个黑屏。 WebView 仍在运行,但我看不到它:(。

我也尝试将其添加到 .xml 视图文件中,但没有结果。我还想防止页面重新加载。我试图将视图设置为可见。尝试了一些功能,如 w.invalidate()。

MainActivity.java

public class MainActivity extends Activity {

    public static final String EXTRA_FROM_NOTIFICATION = "EXTRA_FROM_NOTIFICATION";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.v("main"," create ");
        if (savedInstanceState == null) {
            Intent i = new Intent(MainActivity.this, TestService.class);
            TestService.setMain(this);
            TestService.setView();
            MainActivity.this.startService(i);
        } else {
            TestService.setAgain(); 
        }
     }

    @Override
    public void onBackPressed() {
        Log.v("main","back press");
    }

    @Override
    public void onPause() {
        super.onPause();
    }

    @Override
    public void onResume() {
        super.onResume();
    }
}

TestService.java

public class TestService extends Service {
    private static WebView w;
    private static MainActivity ma;

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
    @Override
    public void onCreate() {       
            super.onCreate();
    }
    public static void setMain(MainActivity a) {
        ma = a;
        Log.e("main", " setData " );
    }

    public static void setView() {
        Log.e("TestService", "FIRST TIME SETUP");
        w = new WebView(ma);
        ma.setContentView(w);
        w.getSettings().setDomStorageEnabled(true); // use localstorage
        w.getSettings().setJavaScriptEnabled(true);
        w.loadUrl("file:///android_asset/www/index.html");

    }

    public static void setAgain() {
        w.bringToFront();
        w.loadUrl("javascript: test();");
        Log.e("TestService", w.getVisibility() + "");   // returns 0 (View.VISIBLE)
    }

}

index.html

<html>
<head>
   <title>Webview test Android</title>
<style>
body {
  background: white;
}
html {
    min-width:100%;
    min-height:100%;
}
</style>
</head>

<body>
   Counter<br>
  <h1><div id="counter"></div></h1>
  <script>
   var counter = 0;
   document.getElementById("counter").innerHTML = counter;
   setTimeout(function(){ count(); }, 1000);

   function test() {
      console.log("Test");
      alert("Jooo");
   }


   function count() {
      counter++;
      document.getElementById("counter").innerHTML = counter;
      setTimeout(function(){ count(); }, 1000);
      console.log("count " + counter);
   } 
</script>
  <font color="#ff0">Test</font>
</body>
</html>

也许有人知道正确的方法吗?

【问题讨论】:

    标签: android view webview onresume onpause


    【解决方案1】:

    没有。

    服务明确用于在后台处理数据。 不允许显示服务中的任何内容(少数特殊情况除外),也不推荐。

    在你的情况下,我可以看到你在做

    setContentView(...);
    

    只有一次。尝试将其重新附加到

    else {
        TestService.setAgain(); 
    }
    

    条件,因为这就是你得到黑屏的原因。

    但是,我仍然可以在这里看到一个非常糟糕的设计。我想我可以提供帮助,如果你能准确地说明你想要达到的目标 - 即。您的工作流程的目的是什么。

    我猜这可能与在后台运行的某种 javascript 有关?通常这是一个不好的做法。用户会期望应用程序在按下某个主页或应用程序退出前台时停止消耗资源。当然,除非你正在编写基于 javascript 的比特币矿工 :)

    【讨论】:

    • 是的。我认为我的 Android 技能不太好……我想做的是保持 NodeJs 站点的开放。我正在尝试做的一个例子是一种 Gps 跟踪。当有人需要此用户时,我想向应用程序提供反馈。然后我可以给用户敬酒。
    • 如果您尝试从 Web 环境访问本机功能,请尝试 cordova.apache.org 此外,它应该作为位于后台服务中的基于 REST 的调用来完成,而不是整个 Web 视图。考虑到它会产生的负载,该平台很有可能会很快杀死您的服务。此外,没有 100% 保证该服务在应用程序被终止后仍然存在。尝试对 REST api 进行简单的 HTTP GET,而不是使用 javascript。这样您就可以从后台运行一小部分数据。
    • 好的。我知道这是一个不好的方法。所以也许它比重新加载整个页面更好。并从原生应用中获取一些数据。
    猜你喜欢
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 2011-05-21
    • 2012-08-05
    相关资源
    最近更新 更多