簡體   English   中英

以編程方式清除Android上的PhoneGap / Cordova應用程序緩存以模擬全新安裝?

[英]Programmatically clear PhoneGap/Cordova app's cache on Android to simulate a fresh install?

這與我之前的問題“ 如何在每次安裝時在我的Android模擬器上清除應用程序的localStorage”有關? ”。

它還建立在' 如何清除Android應用緩存? '和' 如何以編程方式清除應用程序數據? ”。

上述問題均未提供適用於Android PhoneGap / Cordova應用程序的直接答案。 Igor Hrupin撰寫的 這篇博 介紹了原生 Android應用程序環境中的情況,因此這個問題擴展到了Cordova。

我會自己發一個答案,但我是一個完整的Java菜鳥,所以請編輯改進。

剛看到這個。 它可以用一條線完成。 我不確定這是否是你想要的,但它符合我的目的,即在啟動時清除緩存

https://coderwall.com/p/aj79eg

super.clearCache(); // just add This Line
super.loadUrl("file:///android_asset/www/index.html");

我無法強制android重新加載新版本:

super.loadUrl("file:///android_asset/www/index.html");

在調用之間,所以我首先借用了你的代碼,該代碼運行得很好,除了我的應用程序編寫的所有數據都被刪除了。

一個快速簡單的解決方法是更改​​上面文件的URL:

super.loadUrl("file:///android_asset/www/index.html?1");

並改變背后的數字? 每次加載。 最后我補充說:

import java.util.Random;

public class MainActivity extends DroidGap {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        Random generator = new Random();
        int r = generator.nextInt();
        super.onCreate(savedInstanceState);
        super.loadUrl("file:///android_asset/www/index.html?" + r);
    }
}

現在,每次重建應用程序時,它都會刷新html文件的緩存版本。

我非常想知道如何從應用程序本身強制loadUrl進行刷新,或強制重新加載。

這個答案借用了Igor Hrupin撰寫的 這篇博文中的大量代碼。

你的Project > src > [com/org/whatever].[YourNameSpace].[ActivityNameHere] > [ActivityNameHere].java應該看起來像普通的PhoneGap應用程序。

package [com/org/whatever].[YourNameSpace].[ActivityNameHere];

import org.apache.cordova.*;
import android.os.Bundle;

public class [ActivityNameHere] extends DroidGap {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.loadUrl("file:///android_asset/www/index.html");
    }    
}

我們所做的是將其更改為以下代碼。 為清楚起見,未注明的行被注釋掉,但在實現時應該取消注釋。

請記住用您自己的值替換[com/org/whatever][YourNameSpace]多個 [ActivityNameHere]占位符。

// package [com/org/whatever].[YourNameSpace].[ActivityNameHere];

// import org.apache.cordova.DroidGap;
// import android.os.Bundle;

   import java.io.File;
   import android.util.Log;

// public class [ActivityNameHere] extends DroidGap {

       private static [ActivityNameHere] instance;

    // @Override
    // public void onCreate(Bundle savedInstanceState) {

           instance = this;
           [ActivityNameHere].getInstance().clearApplicationData();

    // super.onCreate(savedInstanceState);
    // super.loadUrl("file:///android_asset/www/index.html");
    // }

   public static [ActivityNameHere] getInstance() {
       return instance;
   }

   public void clearApplicationData() {
       File cache = getCacheDir();
       File appDir = new File(cache.getParent());
       if (appDir.exists()) {
           String[] children = appDir.list();
           for (String s : children) {
               if (!s.equals("lib")) {
                   deleteDir(new File(appDir, s));
                   Log.i("TAG", "**************** File /data/data/APP_PACKAGE/" + s + " DELETED *******************");
           }
       }
       }
   }

   public static boolean deleteDir(File dir) {
       if (dir != null && dir.isDirectory()) {
           String[] children = dir.list();
           for (int i = 0; i < children.length; i++) {
               boolean success = deleteDir(new File(dir, children[i]));
               if (!success) {
                   return false;
           }
       }
       }
           return dir.delete();
   }

// }

正如我的問題所述,我沒有Java技能,所以我從我能找到的東西中將它一起攻擊並且似乎有效。 請相應地進行編輯 - 我認為這是人們在需要時可以有效地復制和粘貼的東西,因為Android上的PhoneGap的全部意義是從Java中抽象開發人員(為了記錄,我會得到一旦我的當前項目完成,就學習。

代碼似乎有效,至少在我的情況下。 加入會很好 -

(1)的能力來調用從JS此函數,沿這些線

(2)選擇僅在第一次運行應用程序時清除緩存,這樣您就可以模擬“強制關閉”的應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM