每当用户更新我的应用程序时,我都想清除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。关于如何准确完成这项工作的任何想法?也许我出了点问题。
谢谢。
答案 0 :(得分:0)
您用来查找context
的{{1}}引用的WebView
是findViewById
中的context
,而不是Receiver
中的context
因此,Activity
无法访问WebView
有很多可能性:
您可以使用LocalBroadcastReceiver
与保存对WebView
的引用的活动进行通信,从那里您可以像在接收器中一样尝试正确清除缓存。 mWebview.clearCache(true);
在您的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
。请记住,这是一个非常丑陋的解决方案(即使它可以工作),并且远非防弹解决方案。