每次启动应用程序时如何刷新 webview 的内容?

Posted

技术标签:

【中文标题】每次启动应用程序时如何刷新 webview 的内容?【英文标题】:How do I refresh the contents of a webview everytime the app is launched? 【发布时间】:2015-07-11 17:40:04 【问题描述】:

每次有人启动我的应用程序时,我都会尝试刷新我的 webview 的内容。假设有人转到应用程序内的不同页面或转到后台然后重新启动应用程序,我希望我的 webview 的内容刷新/重新加载基于我在服务器上所做的最新更改。 这是我到目前为止的代码:

public class MainActivity extends Activity 
    WebView webview;
    ProgressBar progress; 
    public final static int MENU_FULLSCREEN_ON = 3;
    public final static int MENU_FULLSCREEN_OFF = 4;
    private boolean fullscreen = true;
    public static Object SPLASH_LOCK = new Object();
    @Override
    public void onCreate(Bundle savedInstanceState)
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
       // getWindow().requestFeature(Window.FEATURE_PROGRESS);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.main);
        progress = (ProgressBar) findViewById(R.id.ProgressBar);
        progress.setVisibility(View.VISIBLE);
         webview = (WebView)findViewById(R.id.webview);


         if(CheckNetwork.isInternetAvailable(MainActivity.this))
        
        webview.setInitialScale(1);
        WebSettings webSettings = webview.getSettings();
        webSettings.setjavascriptEnabled(true);

        webview.getSettings().setJavaScriptEnabled(true);
        webview.getSettings().setLoadWithOverviewMode(true);
        webview.getSettings().setUseWideViewPort(true);
      //  webview.setWebViewClient(new MyCustomWebViewClient());
        if (Build.VERSION.SDK_INT >= 11)
            webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        
        webview.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
        webview.setScrollbarFadingEnabled(false);
       webview.getSettings().setRenderPriority(RenderPriority.HIGH);
        webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
       // webview.getSettings().setBlockNetworkLoads(true);
        webview.getSettings().setBuiltInZoomControls(true); 
        webview.clearCache(true);
        webview.loadUrl("http://myserver.com/firstpage");
        webview.getSettings().setDomStorageEnabled(true);
        webview.getSettings().setDatabaseEnabled(true);
        webview.getSettings().setAppCacheEnabled(true);
        //http://www.inpixelitrust.fr/demos/restaurant_picker/
        //file:///android_asset/index.html
        webview.reload();
        webview.getSettings().setSupportZoom(false);
         else
              Toast toast = Toast.makeText(MainActivity.this, "No Internet Connection", Toast.LENGTH_LONG);
              toast.show(); 
              AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
              alertDialog.setTitle("Connection Problem");
              alertDialog.setMessage("You need to be connected to the internet to view this app");
              alertDialog.setButton("OK", new DialogInterface.OnClickListener() 

                  public void onClick(final DialogInterface dialog, final int which) 
                      return;
                  
              );
              alertDialog.show();

        
       /* webview.setWebChromeClient(new WebChromeClient()
        
         public void onProgressChanged(WebView view, int progress)
         
           // update the progressBar
           MainActivity.this.setProgress(progress * 100);
         
        );*/
        if (!isTaskRoot()) 
            final Intent intent = getIntent();
            final String intentAction = intent.getAction();
            if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) 
                finish();
                return;
            
        

        setFullscreen();
    

    public boolean onKeyDown(int keyCode, KeyEvent event) 
        if(event.getAction() == KeyEvent.ACTION_DOWN)
            switch(keyCode)
            
            case KeyEvent.KEYCODE_BACK:
                if(webview.canGoBack() == true)
                    webview.goBack();
                else
                    finish();
                
                return true;
            

        
        return super.onKeyDown(keyCode, event);
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    
      super.onCreateOptionsMenu(menu);

      menu.add(0, MENU_FULLSCREEN_ON, 0, R.string.menu_fullscreen_on);
      menu.add(0, MENU_FULLSCREEN_OFF, 0, R.string.menu_fullscreen_off);


      return true;
    

    @Override
    public boolean onPrepareOptionsMenu(Menu menu)
    
      super.onPrepareOptionsMenu(menu);

      menu.findItem(MENU_FULLSCREEN_ON).setVisible(!fullscreen);
      menu.findItem(MENU_FULLSCREEN_OFF).setVisible(fullscreen);

      return true;
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    
      switch (item.getItemId()) 

      case MENU_FULLSCREEN_ON:
        fullscreen = true;
        setFullscreen();
        return true;
      case MENU_FULLSCREEN_OFF:
        fullscreen = false;
        setFullscreen();
        return true;

      
      return false;
    
    private void setFullscreen()
    
      if (fullscreen) 
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().clearFlags(
            WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
       else 
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().addFlags(
            WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
      

    
/*
    @Override
    protected void onNewIntent(Intent intent) 

          setFullscreen();


    */


    private class MyCustomWebViewClient extends WebViewClient 
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) 
            //view.loadUrl(url);
            return true;
        
        public void onPageStarted(WebView view, String url, Bitmap favicon) 
            progress.setVisibility(View.VISIBLE);
          
          public void onPageFinished(WebView view, String url) 
            progress.setVisibility(View.GONE);
            synchronized (SPLASH_LOCK) 
                SPLASH_LOCK.notifyAll();
            
          
    


【问题讨论】:

【参考方案1】:

您需要覆盖 onResume() 然后再次加载 url。

【讨论】:

【参考方案2】:

onResume() 在活动返回前台时调用。你可以把你的重装放在那里。像这样的:

@Override
protected void onResume()
    super.onResume();
    webView.reload();

【讨论】:

【参考方案3】:

您可以这样做,但请确保您检查WebView 不为空,因为onResumeonCreate 之前被调用并且WebView 可能不存在于onResume 中!

@Override
protected void onResume() 
    super.onResume();
    if(webView != null)
        webView.loadUrl(...);
        or
        webView.reload();
    

【讨论】:

如果 webview 应该显示一个静态页面,我会选择这个答案,而用户不应该通过 webview 进入另一个“屏幕”。否则@ChrisS 的答案应该可以正常工作(但一定要检查 webview 是否为空) 用户通过 webview 导航说 index.html 是第一页,它引用了其他页面,如 secondpage.html 和返回。如果每次用户来回都可以刷新,那就更酷了。上面的代码是否完美? reload 将“重新加载”他的当前页面.. 而如果您调用 loadUrl(".../index.htm") 它将重新加载索引页面...这取决于您要重新加载的内容 我能够按预期正确刷新。但是,我丢失了密钥库,想看看是否可以从 html webview 文件中更新视图? 您能解释一下密钥库是什么意思吗?否则,您可以编写一个 JavaScript 函数来执行重新加载并像这样调用它 myWebView.loadUrl("javascript:myJavaScriptReloadFunction()");

以上是关于每次启动应用程序时如何刷新 webview 的内容?的主要内容,如果未能解决你的问题,请参考以下文章

使用 webview 和刷新按钮加载 android

JavaScript 修改 webview 内容后,Android WebView 不刷新

每次单击标签时如何刷新标签主机标签内容?

在 webview 上刷新标签栏项目

WebView返回时停留在第一层界面,重复刷新此界面

如何在通知单击时重新启动/刷新活动内容