Как отключить кеш браузера Android навсегда?

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

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

adb shell pm clear com.android.browser

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

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

Хотя это временное решение, если вам нужно постоянно очищать кеш браузера 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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

AJAX - установите заголовок запроса, чтобы получить reqeust 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

Ответ 6

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