Очистить кеш веб-просмотра в приемнике вещания? - PullRequest
0 голосов
/ 03 января 2019

Я хотел бы очистить кеш веб-просмотра всякий раз, когда пользователь обновляет мое приложение. Я пытался найти множество решений, но, похоже, ни одно из них не рассматривало это специально. Я зарегистрировал приемник вещания следующим образом.

Файл манифеста:

<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);
}
}

Но я не могу получить доступ к веб-просмотру в приемнике вещания. Есть идеи, как это сделать? Может быть, я что-то не так понимаю.

Спасибо.

1 Ответ

0 голосов
/ 03 января 2019

context, который вы используете для нахождения WebView ссылки по findViewById - это context из Receiver, а не context из Activity, поэтому он не может получить доступ к WebView

Существует множество возможностей:

Решение 1

Вы можете использовать LocalBroadcastReceiver для связи с действием, которое содержит ссылку на ваш WebView,оттуда вы можете правильно очистить кеш, как вы пытались сделать в приемнике.mWebview.clearCache(true);

Решение 2

В onReceive вашего BroadcastReceiver вы можете сохранить предпочтение в SharedPreferences, сообщая, что произошло обновление.

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

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

И затем в вашем Activity, который имеет дело с 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 является значением по умолчанию для hasAppUpdated, и после получения значения из предпочтений вы можете захотеть снова вернуть предпочтение в значение false.

Уродливое решение

Еще один способ сделать это может быть этот уродливый взлом, который я не рекомендую .Я не проверял это, но если вы используете WebView, тогда в папке кэша вашего приложения, вероятно, есть папка org.chromium.android_webview (для версий ниже API 19 это может быть не так, поскольку WebView тогда не использовалchromium), и внутри этой папки у вас есть кэш WebView, поэтому, если вы удалите файлы внутри этой папки с помощью java.io.File API, вы, вероятно, решите свою проблему, не обращаясь к WebView.Помните, что это очень уродливое решение (если оно даже работает) и далеко не пуленепробиваемое решение.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...