关于简历的黑色webview

时间:2014-09-08 10:18:27

标签: android view webview onresume onpause

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

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

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

添加WebView

第一次运行时效果很好。当我按下主页按钮时,WebView仍在运行(console.log(),从javascript给出反馈)。回到应用程序,我看到一个黑屏。 WebView仍在运行,但我无法看到它:(。

我还尝试将其添加到.xml View文件中,但没有结果。我还想阻止页面重新加载。我试图将视图设置为可见。尝试了一些函数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>

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

1 个答案:

答案 0 :(得分:1)

不。

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

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

setContentView(...);

只有一次。尝试在

中重新附加它
else {
    TestService.setAgain(); 
}

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

然而,我仍然可以看到一个非常糟糕的设计。如果你能准确地陈述你想要实现的目标,我认为我可以提供帮助 - 即。你的工作流程的目的是什么。

我想这可能与某种在后台运行的javascript有关?通常这是一种不好的做法。用户希望应用程序停止消耗资源,一个家庭被按下或app被取消前台。当然,除非您正在编写基于javascript的比特币矿工:)