Dzięki zasobom jest wbudowana obsługa zapewniania alternatyw dla różnych języków, wersji systemu operacyjnego, orientacji ekranu itp., Jak opisano tutaj . Żadna z tych opcji nie jest dostępna z aktywami. Ponadto wiele części interfejsu API obsługuje użycie identyfikatorów zasobów. Wreszcie, nazwy zasobów są zamieniane na stałe nazwy pól, które są sprawdzane podczas kompilacji, więc jest mniej szansy na rozbieżności między kodem a samymi zasobami. Nic z tego nie dotyczy aktywów.
Dlaczego więc w ogóle ma folder zasobów? Jeśli chcesz obliczyć zasób, którego chcesz użyć w czasie wykonywania, jest to dość łatwe. W przypadku zasobów musisz zadeklarować listę wszystkich identyfikatorów zasobów, których można użyć, i obliczyć indeks na liście. (Jest to dość niewygodne i stwarza możliwości wystąpienia błędu, jeśli zestaw zasobów zmienia się w cyklu programowania). (EDYCJA: można pobrać identyfikator zasobu według nazwy getIdentifier
, ale traci to zalety sprawdzania czasu kompilacji.) Zasoby mogą być również zorganizowane w hierarchię folderów, która nie jest obsługiwana przez zasoby. To inny sposób zarządzania danymi. Chociaż zasoby pokrywają większość przypadków, zasoby są sporadycznie wykorzystywane.
Jeszcze jedna różnica: zasoby zdefiniowane w projekcie bibliotecznym są automatycznie importowane do projektów aplikacji zależnych od biblioteki. W przypadku zasobów tak się nie dzieje; pliki zasobów muszą znajdować się w katalogu zasobów projektów aplikacji. [EDYCJA: W przypadku nowego systemu kompilacji opartego na systemie Gradle (używanego z Android Studio) nie jest to już prawdą. Katalogi zasobów dla projektów bibliotecznych są spakowane do plików .aar, więc zasoby zdefiniowane w projektach bibliotecznych są scalane w projekty aplikacji (więc nie muszą znajdować się w katalogu aplikacji, /assets
jeśli znajdują się w bibliotece, do której się odwołuje).]
EDYCJA: Jeszcze jedna różnica pojawia się, jeśli chcesz spakować niestandardową czcionkę z aplikacją. Istnieją wywołania API do utworzenia Typeface
pliku czcionki zapisanego w systemie plików lub w assets/
katalogu aplikacji . Ale nie ma interfejsu API do utworzenia Typeface
z pliku czcionek przechowywanego w res/
katalogu (lub z pliku InputStream
, który pozwoliłby na użycie res/
katalogu). [ UWAGA: W Androidzie O (teraz dostępnym w wersji alfa) będziesz mógł dołączać niestandardowe czcionki jako zasoby. Zobacz opis tej od dawna spóźnionej funkcji. Jednak dopóki minimalny poziom interfejsu API wynosi 25 lub mniej, będziesz musiał trzymać niestandardowe czcionki jako zasoby, a nie zasoby.]
res
oznacza zasoby, to coassets
oznacza?raw/
katalogu?/res
katalogach i / / resources jest tylko do odczytu, ponieważ są one spakowane w pliku apk.Oba są dość podobne. Prawdziwa główna różnica między nimi polega na tym, że w
res
katalogu każdy plik ma wstępnie skompilowaną wersję, doID
której można łatwo uzyskać dostępR.id.[res id]
. Jest to przydatne, aby szybko i łatwo uzyskać dostęp do obrazów, dźwięków, ikon ...assets
Katalog jest bardziej podobny do systemu plików i zapewnia większą swobodę, aby umieścić dowolny plik, który chcesz tam. Następnie możesz uzyskać dostęp do każdego pliku w tym systemie, tak jak podczas uzyskiwania dostępu do dowolnego pliku w dowolnym systemie plików za pośrednictwem Java. Ten katalog jest przydatny do takich rzeczy, jak szczegóły gry, słowniki, itp. Mam nadzieję, że to pomaga.źródło
Assets
folderze, system Android zawiera terazfonts
katalog i możemy tam umieścić niestandardowy plik czcionek lub możemy pobrać dla nas studio Android.Wiem, że to jest stare, ale dla jasności, każde z nich znajduje się w oficjalnej dokumentacji Androida:
z http://developer.android.com/tools/projects/index.html
assets/
To jest puste. Możesz go użyć do przechowywania surowych plików zasobów. Pliki, które zapisujesz tutaj, są kompilowane w istniejącym pliku .apk, a oryginalna nazwa pliku zostaje zachowana. Możesz poruszać się po tym katalogu w taki sam sposób, jak w typowym systemie plików za pomocą identyfikatorów URI i odczytywać pliki jako strumień bajtów za pomocą AssetManager. Na przykład jest to dobra lokalizacja dla tekstur i danych gry.
res/raw/
Dla dowolnych plików surowych zasobów. Zapisywanie plików zasobów tutaj zamiast w katalogu asset / różni się tylko sposobem dostępu do nich. Pliki te są przetwarzane przez aapt i należy się do nich odwoływać z aplikacji przy użyciu identyfikatora zasobu w klasie R. Na przykład jest to dobre miejsce dla multimediów, takich jak pliki MP3 lub Ogg.
źródło
Oto kilka kluczowych punktów:
Wniosek
źródło
Jeśli chcesz je odesłać gdzieś w kodzie Java, umieść swoje pliki w katalogu „res”.
Wszystkie pliki w folderze res zostaną zindeksowane w pliku R, co znacznie przyspiesza (i znacznie ułatwia!) Ich ładowanie.
źródło
Używaj zasobów takich jak system plików, aby zrzucać wszelkiego rodzaju pliki. I użyj res do przechowywania tego, do czego jest przeznaczony, układów, obrazów, wartości.
źródło
Ted Hopp odpowiedział na to całkiem ładnie. Używam res / raw do moich plików tekstur i modułów cieniujących OpenGL. Myślałem o przeniesieniu ich do katalogu zasobów, aby zapewnić hierarchiczną organizację.
Ten wątek przekonał mnie, żebym tego nie robił. Po pierwsze, ponieważ lubię używać unikalnego identyfikatora zasobu. Po drugie, ponieważ bardzo łatwo jest użyć InputStream / openRawResource lub BitmapFactory do odczytu w pliku. Po trzecie, ponieważ bardzo przydatne jest korzystanie z przenośnej biblioteki.
źródło
Zasoby umożliwiają dołączanie do aplikacji dowolnych plików, takich jak tekst, xml, czcionki, muzyka i wideo. Jeśli spróbujesz dołączyć te pliki jako „zasoby”, Android przetworzy je na swój system zasobów i nie będziesz w stanie uzyskać surowych danych. Jeśli chcesz uzyskać dostęp do danych nietkniętych, Zasoby są jednym ze sposobów, aby to zrobić.
źródło
res/raw
, możesz uzyskać surowe dane za pomocąopenRawResource(resourceName)
.