Webview 应用程序在第一次安装应用程序时工作,但之后只显示空白的白屏

Posted

技术标签:

【中文标题】Webview 应用程序在第一次安装应用程序时工作,但之后只显示空白的白屏【英文标题】:Webview app works first time app is installed but after that shows only blank white screen 【发布时间】:2019-12-11 22:34:06 【问题描述】:

第一次安装应用程序时,一切正常,但关闭应用程序并再次打开后,只有白屏。网站无法加载。

MainActivity.java 文件

package app.freeairdrop.io;
import ....

public class MainActivity extends Activity
private ProgressBar progressBar;
private WebView webView;
private SwipeRefreshLayout mySwipeRefreshLayout;
private boolean doubleBackToExitPressedOnce;

@SuppressLint("SetjavascriptEnabled")
@Override
public void onCreate(Bundle savedInstanceState) 


    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    progressBar = (ProgressBar) findViewById(R.id.progressBar);
    progressBar.setMax(100);
    webView = (WebView) findViewById(R.id.webView);
    webView.setWebViewClient(new WebViewClientDemo());
    webView.setWebChromeClient(new WebChromeClientDemo());
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setDomStorageEnabled(true);


    webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webView.getSettings().setPluginState(WebSettings.PluginState.ON);
    // webView.getSettings().setMediaPlaybackRequiresUserGesture(false);        
    mySwipeRefreshLayout = 
    (SwipeRefreshLayout)this.findViewById(R.id.swipeContainer);


    mySwipeRefreshLayout.setOnRefreshListener(
            new SwipeRefreshLayout.OnRefreshListener() 
                @Override
                public void onRefresh() 
                    webView.reload();
                    mySwipeRefreshLayout.setRefreshing(false);
                
            
    );



private class WebViewClientDemo extends WebViewClient 
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) 
        Uri uri = Uri.parse(url);
        if (uri.getHost() != null && (url.startsWith("https://freeairdrop.io/") || url.startsWith("https://www.freeairdrop.io/"))) 
            return false;
        

        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        view.getContext().startActivity(intent);
        return true;
    
    @Override
    public void onPageFinished(WebView view, String url) 
        super.onPageFinished(view, url);
        progressBar.setVisibility(View.GONE);
        progressBar.setProgress(100);
    

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) 
        super.onPageStarted(view, url, favicon);
        progressBar.setVisibility(View.VISIBLE);
        progressBar.setProgress(0);
    



private class WebChromeClientDemo extends WebChromeClient 
    public void onProgressChanged(WebView view, int progress) 
        progressBar.setProgress(progress);
    

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
    if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) 
        webView.goBack();
        return true;
    
    else 
    
    return super.onKeyDown(keyCode, event);



@Override
public boolean onCreateOptionsMenu(Menu menu) 
    return true;


@Override
// This method is used to detect back button
public void onBackPressed() 
    if (this.webView.canGoBack()) 
        this.webView.goBack();
        return;
    

    else 
        // Let the system handle the back button
       super.onBackPressed();
    



@Override
protected void onStart() 
    Intent appLinkIntent = getIntent();
    String appLinkAction = appLinkIntent.getAction();
    Uri appLinkData = appLinkIntent.getData();

    if (getIntent().getExtras() != null) 
        webView.loadUrl(String.valueOf(appLinkData));

     else if (getIntent().getExtras() == null)
        webView.loadUrl("https://freeairdrop.io/");

    else 
        webView.loadUrl("https://freeairdrop.io/");
    
    super.onStart();




@Override
protected void onResume() 
    Intent appLinkIntent = getIntent();
    String appLinkAction = appLinkIntent.getAction();
    Uri appLinkData = appLinkIntent.getData();

    if (getIntent().getExtras() != null) 
        webView.loadUrl(String.valueOf(appLinkData));

     else if (getIntent().getExtras() == null)
        webView.loadUrl("https://freeairdrop.io/");

    else 
        webView.loadUrl("https://freeairdrop.io/");
    
    super.onResume();
 


androidMamifest.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="app.freeairdrop.io">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <application
        android:appCategory="productivity"
        android:hardwareAccelerated="true"
        android:allowBackup="true"
        android:fullBackupContent="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:name=".ApplicationClass"
        tools:ignore="GoogleAppIndexingWarning">
        <activity
            android:name="app.freeairdrop.io.MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter android:autoVerify="true">
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:scheme="https"
                    android:host="freeairdrop.io" />
            </intent-filter>


        </activity>
    </application>


</manifest>

每当我使用网站链接访问应用程序时,使用深度链接它每次都有效,即如果有人在 whatsapp 上获得我网站的链接并且他点击它并使用我的应用程序打开该链接,它会完美打开。就像如果我们在 whatsapp 上获得视频链接,我们可以打开 youtube 应用程序。

【问题讨论】:

为 url 记录一个日志并检查你每次得到什么。 @HariNJha 抱歉我没听懂 在 onStart 和 shouldOverrideUrlLoading 中放置 URI 的日志,以查看传递给 webview 加载的内容。第二件事,为什么你同时调用 onStart 和 onResume 。正确了解 Activity 生命周期,然后实施。 【参考方案1】:

getIntent().getExtras() 可能不为 null,但具有非 URL 值。在使用 URLUtil 将值传递给 webview 之前,执行一个额外的步骤来检查值

修改区块onResumeonStart

String gotoUrl = String.valueOf(appLinkData);

if(URLUtil.isValidUrl(gotoUrl))
     webView.loadUrl(gotoUrl);
  else webView.loadUrl("https://freeairdrop.io/");

【讨论】:

它不起作用。您能否提供完整的修改 onStart 方法?【参考方案2】:

愿这个Repo帮你查一下

【讨论】:

以上是关于Webview 应用程序在第一次安装应用程序时工作,但之后只显示空白的白屏的主要内容,如果未能解决你的问题,请参考以下文章

在 webView 上加载本地存储的文件时延迟

Flutter WebView 插件在 iOS 14+ 上安装时会导致应用崩溃

关闭应用程序时清除 Xamarin 表单 WebView cookie

iOS 7 webview 不工作

在webview中完成工作后如何重定向到页面?

Android Webview 给出 net::ERR_CACHE_MISS 消息