Yleiskatsaus Android-tallennustilaan

Varastointi on asia, josta olemme kaikki tietoisia, mutta pidämme sitä itsestäänselvyytenä. Ei kauan sitten, jokainen varastokapasiteetin harppaus oli asteittaista ja näytti mahdottomalta. Nykyään emme ajattele toista ajatellessamme, kuinka paljon laitteistamme on (ja emme voineet välittää vähemmän eroista).

Suurempi asia olisi tarkastella muistiin tallennetun tilanteen kehitystä. Ennen älypuhelimia tallensimme satunnaisen kuvan tai kaksi, joitain pelejä ja paljon tekstiviestejä. Mutta nyt missä tahansa tavallisessa puhelimessa on yhdistelmä sovelluksia, asiakirjoja, valokuvia, videoita, musiikkitiedostoja ja muuta. Selvitetään, miten voimme käyttää laitteiden tallennustilaa sovelluksissamme.

Tässä artikkelissa käsitellään seuraavaa:

  1. Erilaiset tallennustilat Android-puhelimissa
  2. Erot varastotyyppien välillä
  3. Kuinka käyttää tallennustilaa sovelluksessasi

Jokaisella sovelluksella on pääsy kahteen erityyppiseen tallennustilaan: sisäiseen ja ulkoiseen . Näiden kahden tallennustyypin välillä on suuria eroja, ja niiden tunteminen auttaa sinua seuraavan sovelluksen suunnittelussa.

Ennen kuin aloitamme, on sanottava yksi asia tallennuksesta ja välimuistista. Tallennustila on tarkoitettu asioille, jotka haluat tallentaa pysyvästi, kun välimuisti on tarkoitettu tallentamaan asioita väliaikaisesti.

Muuttopäivä

Sisäistä tallennustilaa

Kun jokainen sovellus suoritetaan käyttöjärjestelmässä, sillä on oma sisäinen tallennustila. Tämä tallennustila on yksityinen ja tarkoitettu vain sovelluksen käyttöön. Eli muut sovellukset eivät voi käyttää sitä, eivätkä myöskään käyttäjät. Toinen asia, joka on pidettävä mielessä sisäistä tallennustilaa käytettäessä, on sen saatavuus. Toisin kuin ulkoinen tallennustila, sisäinen tallennustila on aina käytettävissä sovelluksellesi.

Tämän tallennustilan käytöllä on kuitenkin haittoja. Jos käyttäjä poistaa sovelluksen, myös kaikki sovelluksen sisäiseen tallennustilaan tallennetut tiedot poistetaan. Kuvittele, mitä tapahtuisi, jos asennat pelin puhelimeesi ja jostain tiellä päätät poistaa sen. Haluat, että pelisi edistyminen tallennetaan, jos jostain syystä asennat pelin uudelleen.

Joten miten tallennamme tiedoston sisäiseen tallennustilaan?

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

Kuten koodiesimerkistä näet, tallennamme tiedoston nimeltä hello_world_file, joka sisältää tekstin "Hei sisäisestä tallennustilasta!" . Olen luonut kaksi saalislauseketta vain osoittaakseni poikkeuksia, joita voi ilmetä yritettäessä tehdä tätä, mutta voit pienentää ne yhdeksi saalislausekkeeksi yleisellä Poikkeus-objektilla.

Kiinnitä huomiota siihen, että menetelmä openFileOutput avaa tiedoston, jos se on jo olemassa, mutta jos ei, luo sen. Tämän menetelmän toinen parametri on tiedostotila. Tämä parametri osoittaa tiedoston laajuuden ja pääsyn siihen. Oletusarvo on MODE_PRIVATE, mikä tekee tiedostosta vain sovelluksesi käytettävissä.

Tämän parametrin kaksi muuta arvoa ovat MODE_WORLD_READABLE ja MODE_WORLD_WRITEABLE, mutta ne ovat vanhentuneet API 17: n jälkeen. Yksityisten tiedostojen jakaminen muiden sovellusten kanssa käyttää erilaista logiikkaa, josta voit lukea lisää täältä. Lopuksi kirjoittaessamme tiedostoon muunnamme merkkijonomme tavuiksi ja suljet tiedoston lopussa.

Rikki kiintolevy - tallennustilan varmuuskopio

Ulkoinen tallennustila

Päinvastoin kuin nimestä käy ilmi, tämä on tallennustila, joka määritetään sillä, että siihen ei ole aina pääsyä. Tämä voi tarkoittaa, että se voi olla ulkoinen SD-kortti (toissijainen ulkoinen tallennustila), mutta se voi olla myös laitteesta löytyvä tallennustila (ensisijainen ulkoinen tallennustila).

Tosiasiat tuodaan kotiin ulkoisella tallennustilalla, jota voidaan käyttää, kun liität laitteen tietokoneeseen USB-kaapelilla. Kuten olet ehkä arvannut, kaikki tämäntyyppiseen tallennustilaan tallennetut laitteet ovat laitteen muiden sovellusten käytettävissä, mutta ne säilytetään, jos poistat sovelluksen.

Ennen kuin voimme osoittaa, kuinka tiedostot tallennetaan ulkoiseen tallennustilaan, meidän on tehtävä kaksi asiaa:

  1. Varmista, että siellä on tarpeeksi tilaa tiedoston tallentamiseen
  2. Pyydä lupaa ajon aikana

Riittävän tallennustilan varmistaminen vaatii seuraavat koodirivit:

//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; }

Ulkoisen tallennustilan saamiseksi meidän on lisättävä seuraava lupa AndroidManifest.xml-tiedostoon:

Lisäksi API 23: n jälkeen vaarallisia käyttöoikeuksia ei sallita asennuksen aikana, mutta ajon aikana. Kirjoittaminen ulkoiseen tallennustilaan on luokiteltu yhdeksi, joten meidän on lisättävä logiikkaa, jotta käyttäjä voi päättää myöntääkö sovellukselle luvan vai ei.

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

Meidän writeFileToExternalStorage näyttää tältä:

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

Jos haluat nähdä esimerkin kaikista tässä esitetyistä koodeista, voit siirtyä tähän GitHub-arkistoon.

Yhdeksän kahdeksan seitsemän

Hyvä tietää

Edellä oli vain kaksi yksinkertaista esimerkkiä siitä, miten voit työskennellä sovelluksesi erityyppisten tallennustilojen kanssa. Koska olemme tekemisissä järjestelmän hallinnoiman resurssin kanssa, meidän tulisi olla tietoisia myös siihen liittyvistä käyttäytymistavoista.

Oletuksena sovelluksesi asennetaan sisäiseen tallennustilaan ( katso sisäisen vain selitys ), mutta sovellusliittymän tasosta 8 alkaen voit lisätä luetteloon määritteen, installLocation , jonka avulla sovelluksesi voidaan asentaa ulkoiseen tallennustilaan. Yksi syy siihen on, jos sovelluksesi on erittäin suuri, ja haluat, että käyttäjä asentaa sen laitteen ulkoiseen tallennustilaan, koska siellä on enemmän tilaa.

Tälle määritteelle on kolme arvoa:

  • auto - tarkoittaa, että sinulla ei ole tiettyä asetusta, johon sovellus asennetaan. Sovellus yrittää asentaa sisäiseen muistiin, mutta jos se on täynnä, se asentaa sen ulkoiseen muistiin
  • internalOnly - sovellus asennetaan vain sisäiseen tallennustilaan, ja jos siellä ei ole tarpeeksi tilaa, sitä ei asenneta
  • preferExternal - tarkoittaa, että haluat sovelluksesi asennettavan ulkoiseen muistiin, mutta jos siellä ei ole tarpeeksi tilaa, se asennetaan sisäisesti

Sekä auto- että preferExternal-vaihtoehdoissa käyttäjällä on mahdollisuus siirtää sovellus ulkoisesta tallennustilasta sisäiseen ja päinvastoin.

Muista, että kun käyttäjä yhdistää laitteen tietokoneeseen ja antaa sen jakaa tietoja tai poistaa SD-kortin, kaikki ulkoisesta tallennustilasta käynnissä olevat sovellukset tuhoutuvat. Jos sovelluksesi käyttää jotakin seuraavista ominaisuuksista, sinun ei pitäisi asentaa sitä ulkoiseen tallennustilaan:

Erilaiset palvelut (hälytys palvelun t erityisesti), Input Method Moottorit, Live-taustakuvat, Application widgetit, tiliedustajat, Sync sovittimet, Device Ylläpitäjät ja Vastaanottimet kuuntelee boot päätökseen.