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

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

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

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

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

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

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

Используя команду 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(); } } } 

}

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

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

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

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

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

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

Я столкнулся с подобной проблемой, используя множество 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 MYH:i:s")."GMT"); header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no-cache"); 

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

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