我的应用程序中有一个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>
也许有人知道正确的方法吗?
答案 0 :(得分:1)
不。
服务明确用于在后台处理数据。 不允许在服务中显示任何内容(少数特殊情况除外),也不建议使用。
在你的情况下,我可以看到你正在做
setContentView(...);
只有一次。尝试在
中重新附加它else {
TestService.setAgain();
}
条件,因为这就是你获得黑屏的原因。
然而,我仍然可以看到一个非常糟糕的设计。如果你能准确地陈述你想要实现的目标,我认为我可以提供帮助 - 即。你的工作流程的目的是什么。
我想这可能与某种在后台运行的javascript有关?通常这是一种不好的做法。用户希望应用程序停止消耗资源,一个家庭被按下或app被取消前台。当然,除非您正在编写基于javascript的比特币矿工:)