繁体   English   中英

如何永久禁用Android浏览器缓存?

[英]How to disable the Android browser cache permanently?

我正在开发一个基于Web的应用程序,该应用程序也应在基于Android的手机上运行。 由于没有人,因此我可以成功使用SDK中的模拟器。

但是,由于我不断更改应用程序的某些JavaScript页面,因此浏览器使用了缓存中的旧版本(服务器上的缓存控制是正确的-但我不存在需要过多缓存的正常使用情况)

那么,有没有办法告诉(默认)Android浏览器永久禁用其缓存?
还是可以使用adb命令清除缓存?

在调试期间,将meta标签添加到页面以禁用缓存。

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

}

尝试将时间(从纪元格式开始,以毫秒为单位)附加为每个调用的查询参数。 这将防止使用缓存的副本。 我们在普通的J2EE / Struts / Tomcat堆栈中执行此操作,并且它与所有(桌面)浏览器都可以很好地工作。

如果要在生产中使用缓存行为,则可以轻松删除多余的参数。

为什么不使用缓存清单?

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

如果您将js文件放在网络部分中,这应该可以满足您的需求:

缓存清单文件中NETWORK:节标题下列出的文件是白名单资源,需要连接到服务器。 即使用户处于脱机状态,对此类资源的所有请求也会绕过缓存。 可以使用通配符。

我在使用大量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

我使用的是Android模拟器,因此可以通过打开浏览器并单击菜单来清除内置的浏览器。 在这里,我选择了“设置”,然后选择“隐私和安全性”。 这提供了单击清除缓存的选项。

如果您所有刚刚测试的显示都已修复,则可以切换到duckduckgo并仅刻录这些东西。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM