清除广播接收器中的WebView缓存?

时间:2019-01-03 14:09:36

标签: java android webview

每当用户更新我的应用程序时,我都想清除Webview缓存。我尝试查找许多解决方案,但似乎没有一个专门解决此问题。 我已经按照以下步骤注册了广播接收器。

清单文件:

<receiver android:name=".UpdateReceiver">
    <intent-filter  >
            <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
            <data android:scheme="package" android:path="com.mypackage.com" />
        </intent-filter>
</receiver>

广播接收器:

public class UpdateReceiver extends BroadcastReceiver 
{
private WebView mWebview ;
@Override
public void onReceive(Context con, Intent intent)
 {

    mWebview = (WebView) findViewById(R.id.webView);
    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.removeAllCookie();
    mWebview.clearCache(true);
}
}

但是,我无法在广播接收器中访问Webview。关于如何准确完成这项工作的任何想法?也许我出了点问题。

谢谢。

1 个答案:

答案 0 :(得分:0)

您用来查找context的{​​{1}}引用的WebViewfindViewById中的context,而不是Receiver中的context因此,Activity无法访问WebView

有很多可能性:

解决方案1 ​​

您可以使用LocalBroadcastReceiver与保存对WebView的引用的活动进行通信,从那里您可以像在接收器中一样尝试正确清除缓存。 mWebview.clearCache(true);

解决方案2

在您的BroadcastReceiver的onReceive中,您可以将偏好设置存储在SharedPreferences中,以告知发生了更新。

@Override
public void onReceive(Context con, Intent intent)
 {

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(); 
    prefs.edit().putBoolean("hasAppUpdated", true).apply();
}

然后在处理Activity的{​​{1}}中,可以验证是否有应用程序更新并清除WebView的缓存。

要从WebView访问值:

SharedPreferences

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(); Boolean hasAppUpdated = prefs.getBoolean("hasAppUpdated", false); if(hasAppUpdated) { prefs.edit().putBoolean("hasAppUpdated", false).apply(); mWebview.clearCache(true); } 的值是false的默认值,从首选项中获取值之后,您可能希望将首选项重新设置为false。

丑陋的解决方案

另一种实现方式可能是我不推荐的这种丑陋的骇客。 我没有对此进行测试,但是如果您使用的是hasAppUpdated,则应用程序的缓存文件夹可能包含一个文件夹WebView(对于版本低于19的API,自org.chromium.android_webview以来可能就不正确了。那时没有使用铬),并且在该文件夹中您拥有WebView的缓存,因此,如果您使用WebView API删除了该文件夹中的文件,则可能无需访问即可解决问题java.io.File。请记住,这是一个非常丑陋的解决方案(即使它可以工作),并且远非防弹解决方案。

enter image description here