Преглед Андроид складишта

Складиштење је оно чега смо сви свесни, али увек га подразумевамо. Недавно је сваки скок у капацитету за похрану био постепени и изгледало је немогуће. У данашње време не размишљамо колико размишљамо о томе колико наши уређаји имају (и не би смели да брину о разликама).

Већа поента би била сагледати еволуцију онога што је ускладиштено у меморији. Пре паметних телефона сачували смо понеку фотографију или две, неке игре и гомилу текстуалних порука. Али сада ће сваки стандардни телефон имати комбинацију апликација, докумената, фотографија, видео записа, музичких датотека и још много тога. Откријмо како можемо да искористимо простор за складиштење уређаја за наше апликације.

Оно што ћемо покрити у овом чланку је:

  1. Различите врсте складиштења на Андроид телефонима
  2. Разлике између врста складишта
  3. Како се користи складиште у вашој апликацији

Свака апликација има приступ двема различитим врстама складишта: интерном и екстерном . Постоје велике разлике између ове две врсте складишта, а њихово познавање ће вам помоћи при дизајнирању ваше следеће апликације.

Пре него што започнемо, морамо рећи једно о складишту и кеш меморији. Складиштење је намењено стварима које желите упорно да сачувате, док је кеш меморија ту да их привремено сачува.

Мовинг Даи

Интерна меморија

Када се свака апликација покрене на оперативном систему, она има своју унутрашњу меморију. Ово складиште је приватно и само за употребу апликације. Значи, друге апликације не могу да му приступе, као ни корисник. Још једна ствар коју морате имати на уму када користите интерну меморију је њена доступност. За разлику од спољне меморије, интерна меморија је увек доступна за вашу апликацију.

Коришћење овог складишта има својих недостатака. Ако корисник уклони апликацију, уклањају се и сви подаци ускладиштени у интерној меморији ваше апликације. Замислите шта би се догодило ако инсталирате игру на телефон и негде низ пут одлучите да је уклоните. Желели бисте да вам се сачува напредак игре, ако бисте којим случајем поново инсталирали игру.

Па, како да сачувамо датотеку у интерној меморији?

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

Као што видите у примеру кода, чувамо датотеку која се зове хелло_ворлд_филе која садржи текст „Здраво из интерне меморије!“ . Направио сам две клаузуле цатцх само да бих демонстрирао изузетке који се могу јавити када то покушавам да урадим, али можете их свести на једну клаузулу цатцх са општим објектом Екцептион.

Обратите пажњу да ће метода опенФилеОутпут отворити датотеку ако већ постоји, али ако не, створиће је. Други параметар ове методе је режим датотеке. Овај параметар означава опсег датотеке и приступ њој. Подразумевана вредност је МОДЕ_ПРИВАТЕ, што датотеку чини доступном само вашој апликацији.

Друге две вредности за овај параметар су МОДЕ_ВОРЛД_РЕАДАБЛЕ и МОДЕ_ВОРЛД_ВРИТЕАБЛЕ, али су застареле од АПИ-ја 17. Дељење приватних датотека са другим апликацијама користи другачији скуп логике о којем више можете прочитати овде. Коначно, приликом писања у датотеку претварамо наш низ у бајтове и обавезно затворимо датотеку на крају.

Сломљени ХДД - Резервна копија складишта

Спољна меморија

Супротно ономе што назив подразумева, ово је складиште које је дефинисано чињеницом да није увек доступно. То може значити да то може бити спољна СД картица (секундарна спољна меморија), али такође може бити и меморија која се налази на уређају (примарна спољна меморија).

Да бисте чињеницу вратили кући, спољна меморија је меморија којој се може приступити када уређај повежете са рачунаром путем УСБ кабла. Као што сте већ претпоставили, све што је ускладиштено у овој врсти складишта доступно је другим апликацијама на вашем уређају, али ће се задржати ако деинсталирате апликацију.

Пре него што покажемо како да сачувамо датотеке у спољном складишту, морамо да урадимо две ствари:

  1. Уверите се да тамо има довољно простора за спремање датотеке
  2. Тражите дозволу током извођења

Да бисте имали довољно простора за складиштење, потребни су следећи редови кода:

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

Да бисмо добили приступ спољној меморији, морамо да додамо следећу дозволу у наш АндроидМанифест.кмл:

Штавише, од АПИ 23, опасне дозволе нису одобрене током времена инсталирања, већ током извођења. Записивање у спољну меморију категорисано је као једно, па морамо додати логику која омогућава кориснику да одлучи да ли ће апликацији одобрити дозволу или не.

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

Наш вритеФилеТоЕктерналСтораге изгледа овако:

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

Ако желите да видите пример целокупног овде представљеног кода, можете да пређете на ово ГитХуб спремиште.

Девет Осам Седам

Добро је знати

Изнад су наведена само два једноставна примера како се ради са различитим врстама складишног простора за вашу апликацију. Будући да имамо посла са ресурсом којим систем управља, требало би да будемо свесни и понашања повезаних с њим.

Подразумевано ће се ваша апликација инсталирати у интерну меморију ( погледајте објашњење интерналОнли ), али са нивоа АПИ 8 у манифест можете додати атрибут инсталлЛоцатион који омогућава апликацији да се инсталира у спољну меморију. Један од разлога за то је ако је ваша апликација веома велика и више бисте волели да је корисник инсталира на спољну меморију уређаја, јер тамо има више простора.

Постоје три вредности за овај атрибут:

  • ауто - значи да немате одређену поставку где ће апликација бити инсталирана. Апликација ће покушати да се инсталира у интерну меморију, али ако је пуна, инсталираће је у спољну меморију
  • интерналОнли - апликација ће се инсталирати само у интерну меморију, а ако тамо нема довољно простора, неће се инсталирати
  • преферЕктернал - значи да желите да ваша апликација буде инсталирана на спољну меморију, али ако тамо нема довољно места, она ће бити инсталирана интерно

И за аутоматску и за преферЕктернал опције, корисник има могућност премештања апликације из спољне меморије у унутрашњу и обрнуто.

Имајте на уму да након што корисник повеже свој уређај са рачунаром и омогући му да дели податке или демонтира СД картицу, све апликације покренуте из спољне меморије се уништавају. Ако ваша апликација користи једну од следећих функција, не бисте је требали инсталирати у спољну меморију:

Разни услуге (аларма сервис а посебно), метод уноса Мотори, Живе позадине примене Видгетс, Аццоунт Манагерс, Синц Адаптери, Администратори уређаја и објављене пријемници слушање за боот завршен.