Как отключить кеш браузера Android навсегда? - PullRequest
14 голосов
/ 06 марта 2011

Я занимаюсь разработкой веб-приложения, которое также должно работать на телефонах на базе Android.Поскольку у меня его нет, я успешно использую эмулятор из SDK.

Но так как я постоянно меняю некоторые страницы JavaScript приложения, браузер использует старые версии из своего кеша (управление кешем)на сервере правильно - но у меня нет там нормального варианта использования, где требуется чрезмерное кэширование)

Так есть ли способ сказать (по умолчанию) браузеру Android, чтобы навсегда отключить его кэш?
Или можно использовать команду adb для очистки кэша?

Ответы [ 6 ]

12 голосов
/ 27 июня 2011

Во время отладки добавьте метатег на свою страницу, чтобы отключить кэширование.

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">

http://www.i18nguy.com/markup/metatags.html

8 голосов
/ 15 июня 2012

С помощью команды adb вы можете очистить кеш браузера и данные пользователя

adb shell pm clear com.android.browser

но это не сработает, если вы выдадите это из среды выполнения программы для Android

см. Мой предыдущий вопрос относительно этого

Хотя это временное решение, если вам необходимо постоянно очищать кэш браузера Android с помощью фоновой службы, это можно сделать с помощью «android.content.pm.IPackageDataObserver». Если вы ищете следующее, то эта служба Проверено и отлично работает

import java.util.List;

import android.app.PendingIntent;
import android.app.Service;    
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.IPackageDataObserver;
import android.content.pm.IPackageStatsObserver;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageStats;
import android.os.Handler;
import android.os.IBinder;


public class CacheCleanerService extends Service {

public static final String REFRESH_INTENT="tritop.android.slwcachecleanerwidget.REFRESH";
public static final String CLEAR_INTENT="tritop.android.slwcachecleanerwidget.CLEAR";
public static final long RECOUNTNDELAY=1500;
private boolean mDND=false;
private Handler mHandler;
private int statsCounter;
private long mCacheSum;
private StatsObserver mStatsObs;
private ClearCacheObserver mClearObs;
private PackageManager mPM;
private List<PackageInfo> mInstPkg;


private Runnable mTriggerCount = new Runnable()
{

    public void run()
    {
     countCache();
    }
 };

 private Runnable mAutoKill = new Runnable()
    {

        public void run()
        {
         stopSelf();
        }
     };


//More info in ApplicationState.java @ android.git.kernel.org
class StatsObserver extends IPackageStatsObserver.Stub{
    public void onGetStatsCompleted(PackageStats stats,boolean bl){
        mCacheSum+=stats.cacheSize;
        statsCounter++;
        if(statsCounter>=mInstPkg.size()){
            updateWidgets();
        }
    }
}

class ClearCacheObserver extends IPackageDataObserver.Stub {
    public void onRemoveCompleted(final String packageName, final boolean succeeded) {
     }
 }

private void countCache() {
    statsCounter = 0;
    mCacheSum = 0;
    mInstPkg= mPM.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES |
               PackageManager.GET_DISABLED_COMPONENTS);
    for(PackageInfo pInfo: mInstPkg){
         //  mPM.getPackageSizeInfo(pInfo.packageName, mStatsObs);
    }
}

private void clearCache(){
    mInstPkg= mPM.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES |
               PackageManager.GET_DISABLED_COMPONENTS);
    //mPM.freeStorageAndNotify(Integer.MAX_VALUE, mClearObs);
    //mPM.freeStorageAndNotify(Long.MAX_VALUE, mClearObs);
    mHandler.postDelayed(mTriggerCount, RECOUNTNDELAY);
}



@Override
public IBinder onBind(Intent arg0) {
    return null;
}

@Override
public void onCreate() {
    mStatsObs = new StatsObserver();
    mClearObs = new ClearCacheObserver();
    mPM = getPackageManager();
    mHandler = new Handler();
}

@Override
public void onDestroy() {
    mHandler.removeCallbacks(mAutoKill);
    mHandler.removeCallbacks(mTriggerCount);
    mDND=false;
    super.onDestroy();
}

@Override
public void onStart(Intent intent, int startId) {
    if(!mDND){
        mHandler.postDelayed(mAutoKill, 20000);
        mDND=true;
        mCacheSum=0;
        statsCounter=0;
        if(CLEAR_INTENT.equals(intent.getAction())){
            clearCache();
        }
        else{
            countCache();
        }
    }
}

}

3 голосов
/ 07 июня 2011

Попробуйте добавить время (в длинных мс с момента форматирования эпохи) в качестве параметра запроса для каждого вызова. Это предотвратит использование кэшированной копии. Мы делаем это в нашем обычном стеке J2EE / Struts / Tomcat, и он хорошо работает со всеми (настольными) браузерами.

Если вы хотите, чтобы кэшированное поведение работало, легко удалить лишние параметры.

2 голосов
/ 20 июня 2012

Почему вы не используете манифест кэша?

https://developer.mozilla.org/en/Offline_resources_in_Firefox

Если вы поместите ваши js-файлы в сетевой раздел, это должно сделать то, что вам нужно:

Файлы, перечисленные в заголовке раздела NETWORK: в файле манифеста кэша, являются ресурсами из белого списка, которые требуют подключения к серверу.Все запросы к таким ресурсам обходят кеш, даже если пользователь не в сети.Подстановочные знаки могут быть использованы.

0 голосов
/ 03 мая 2013

Я использую эмулятор Android и смог очистить встроенный браузер, открыв браузер и нажав меню. Там я выбрал Настройки, а затем «Конфиденциальность и безопасность». Это дало возможность нажать на очистить кэш.

0 голосов
/ 19 июня 2012

Я сталкивался с подобной проблемой, используя множество AJAX и постоянно обновляя браузер эмулятора. Эти два метода помогли мне.

AJAX - установить заголовок запроса для получения запроса if-Modified-Since.

 xhReq.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2005 00:00:00 GMT");

Или с помощью jquery $ .ajax ()

beforeSend: function(xhr) {
    xhReq.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2005 00:00:00 GMT");
}

Если вы используете PHP - задайте информацию заголовка.

header("Expires: Sat, 1 Jan 2005 00:00:00 GMT");
header("Last-Modified: ".gmdate( "D, d M Y H:i:s")."GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");

Источник: http://ajaxpatterns.org/XMLHttpRequest_Call

...