Az Android Storage áttekintése

A tárolás ez a dolog, amiről mindannyian tisztában vagyunk, de mindig természetesnek vesszük. Nemrégiben a tárolókapacitás minden ugrása növekményes volt, és lehetetlennek tűnt. Manapság nem gondolunk egy másik gondolatra, ha arra gondolunk, hogy mennyi van belőle az eszközeinkkel (és nem is érdekelhetnénk kevésbé a különbségeket).

Nagyobb pont az lenne, ha megvizsgálnánk a memóriában tároltak alakulását. Az okostelefonok előtt elmentettük az alkalmi fényképeket, néhány játékot és rengeteg szöveges üzenetet. De most bármelyik szabványos telefonban megtalálhatók lesznek alkalmazások, dokumentumok, fényképek, videók, zenefájlok és egyebek. Tudjuk meg, hogyan használhatjuk fel az eszközök tárhelyét az alkalmazásainkhoz.

Amit a cikkben ismertetünk:

  1. Különböző típusú tárolók Android telefonokon
  2. Különbségek a tárolási típusok között
  3. Hogyan használjuk a tárhelyet az alkalmazásban

Minden alkalmazás két különböző típusú tárolóhoz fér hozzá: belső és külső . Nagy különbségek vannak a kétféle tárhely között, és ezek ismerete segít a következő alkalmazás megtervezésében.

Mielőtt nekilátnánk, egy dolgot el kell mondani a tárolásról és a gyorsítótárról. A tárhely azokra a dolgokra szolgál, amelyeket tartósan menteni szeretne, míg a gyorsítótár a dolgok ideiglenes mentésére szolgál.

Költözés napja

Belső tároló

Amikor minden alkalmazást az operációs rendszeren futtatnak, saját belső tárolóval rendelkezik. Ez a tároló privát, és csak az alkalmazás használatára szolgál. Vagyis más alkalmazások nem férhetnek hozzá, és a felhasználó sem. Egy másik dolog, amelyet a belső tárhely használata során szem előtt kell tartani, annak elérhetősége. A külső tárhelytől eltérően a belső tárhely mindig elérhető az alkalmazásához.

Ennek a tárolónak azonban vannak hátrányai. Ha a felhasználó eltávolítja az alkalmazást, akkor az alkalmazás belső tárhelyén tárolt összes adat is eltávolításra kerül. Képzelje el, mi történne, ha telepítene egy játékot a telefonjára, és valahol az úton úgy döntene, hogy eltávolítja azt. Szeretné, ha mentené a játék előrehaladását, ha véletlenül újból telepítené a játékot.

Szóval, hogyan menthetünk egy fájlt a belső tárhelyre?

public void saveFileInternalStorage() { String FILENAME = "hello_world_file"; String inputToFile = "Hello From Internal Storage!"; try { FileOutputStream fileOutputStream = openFileOutput(FILENAME, Context.MODE_PRIVATE); fileOutputStream.write(inputToFile.getBytes()); fileOutputStream.close(); Toast.makeText(getApplicationContext(), "File " + FILENAME + " has been saved successfully", Toast.LENGTH_SHORT).show(); } catch (FileNotFoundException e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "File " + FILENAME + " has not been saved successfully due to an exception " + e.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "File " + FILENAME + " has not been saved successfully due to an exception " + e.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); } }

Amint a kód példában láthatja, a hello_world_file nevű fájlt mentjük , amely a „Hello From Internal Storage!” Szöveget tartalmazza . . Két fogási záradékot hoztam létre, hogy bemutassam az esetleges kivételeket, amikor megpróbálom ezt végrehajtani, de az általános Kivétel objektummal egy fogási záradékká minimalizálhatja őket.

Ügyeljen arra, hogy az openFileOutput módszer megnyitja a fájlt, ha már létezik, de ha nem, akkor létrehozza. A módszer második paramétere a fájl mód. Ez a paraméter kijelöli a fájl terjedelmét és a hozzáférést hozzá. Az alapértelmezett érték a MODE_PRIVATE, amely a fájlt csak az alkalmazás számára teszi elérhetővé.

Ennek a paraméternek a másik két értéke a MODE_WORLD_READABLE és a MODE_WORLD_WRITEABLE, de a 17. API óta elavultak. A privát fájlok más alkalmazásokkal történő megosztása más logikai készletet használ, amelyről itt olvashat bővebben. Végül, amikor a fájlba írunk, a karakterláncunkat bájtokká konvertáljuk, és a végén feltétlenül zárjuk be a fájlt.

Megszakadt HDD - Storage BackUp

Külső tárhely

A névvel ellentétben ez a tárhely, amelyet az határoz meg, hogy nem mindig érhető el. Ez azt jelentheti, hogy lehet külső SD-kártya (másodlagos külső tárhely), de lehet az eszközön található elsődleges tárhely is.

A tény, hogy otthonról van szó, a külső tároló az a tárhely, amely akkor érhető el, amikor készülékét USB-kábelen keresztül csatlakoztatja a számítógéphez. Mint sejtette, az ilyen típusú tárhelyen tárolt bármi más elérhető az eszközén lévő alkalmazások számára, de az alkalmazás eltávolításakor megmarad.

Mielőtt bemutathatnánk, hogyan menthetjük a fájlokat a külső tárhelyre, két dolgot kell tennünk:

  1. Ellenőrizze, hogy van-e elegendő hely a fájl mentéséhez
  2. Futtatás közben kérjen engedélyt

A megfelelő tárhely biztosításához a következő kódsorokra van szükség:

//Check if you can read/write to external storage public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false; }

A külső tárhely eléréséhez a következő engedélyt kell hozzáadnunk az AndroidManifest.xml fájlhoz:

Továbbá, az API 23 óta a veszélyes engedélyeket nem a telepítés, hanem a futás ideje alatt engedélyezik. A külső tárhelyre történő írás egy kategóriába tartozik, ezért hozzá kell adnunk a logikát, hogy a felhasználó eldönthesse, megadja-e az alkalmazás engedélyét vagy sem.

public void saveFileExternalStorage(View view) { if (isExternalStorageWritable()) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { writeFileToExternalStorage(); } else{ ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); } } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case 0: { writeFileToExternalStorage(); break; } } }

A writeFileToExternalStorage a következőképpen néz ki:

public void writeFileToExternalStorage() { String root = Environment.getExternalStorageDirectory().toString(); File myDir = new File(root + "/saved_files"); if (!myDir.exists()) { myDir.mkdirs(); } try { File file = new File(myDir, "myfile.txt"); FileOutputStream out = new FileOutputStream(file); out.write(inputToFile.getBytes()); out.close(); Toast.makeText(getApplicationContext(), "File myfile.txt" + " has been saved successfully to external storage", Toast.LENGTH_SHORT).show(); } catch (Exception e) { e.printStackTrace(); } }

Ha példát szeretne látni az itt bemutatott összes kódról, akkor áttérhet erre a GitHub-adattárra.

Kilencnyolc hét

Jó tudni

A fentiekben csak két egyszerű példa volt az alkalmazás különböző típusú tárolóinak kezelésére. Mivel egy olyan erőforrással van dolgunk, amelyet a rendszer kezel, ezért tisztában kell lennünk a hozzá kapcsolódó viselkedéssel is.

Alapértelmezés szerint az alkalmazás a belső tárhelyre lesz telepítve ( lásd az internalOnly magyarázatot ), de a 8. API-tól kezdve hozzáadhat egy attribútumot, az installLocation -t a jegyzékhez , amely lehetővé teszi az alkalmazás telepítését külső tárhelyre. Ennek egyik oka az, ha nagyon nagy az alkalmazás, és azt szeretné, ha a felhasználó telepítené az eszköz külső tárolójára, mivel ott több a hely.

Ennek az attribútumnak három értéke van:

  • auto - azt jelenti, hogy nincs külön preferenciája az alkalmazás telepítésének. Az alkalmazást megpróbálja a belső tárhelyre telepíteni, de ha megtelt, akkor a külső tárolóba telepíti
  • internalOnly - az alkalmazás csak a belső tárhelyre kerül telepítésre, és ha nincs elég hely ott, akkor nem lesz telepítve
  • preferExternal - azt jelenti, hogy az alkalmazást külső tárhelyre kívánja telepíteni, de ha nincs elég hely ott, azt belsőleg telepítik

Az auto és a preferExternal opcióknál a felhasználónak lehetősége van az alkalmazást a külső tárhelyről a belsőre helyezni, és fordítva.

Ne feledje, hogy amint a felhasználó csatlakoztatja eszközét a számítógéphez, és lehetővé teszi számára az adatok megosztását vagy az SD-kártya leválasztását, a külső tárhelyről futó összes alkalmazás megsemmisül. Ha az alkalmazás a következő szolgáltatások egyikét használja, ne telepítse külső tárhelyre:

Különböző szolgáltatások (riasztó szolgálat s különösen), Input Method Engines, élő háttérképek, Application Widgets, Fiókkezelőink, szinkron adapterek, Device rendszergazdák és a Broadcast vevők hallgat boot befejeződött.