Interfejsy API Androida 3.0

Poziom API: 11

Platforma Android 3.0 (HONEYCOMB) jest dostępna dla programistów jako komponent pakietu Android SDK, który można pobrać. Platforma do pobrania zawiera bibliotekę Androida i obraz systemu, a także zestaw skórek emulatora i nie tylko. Platforma do pobrania nie zawiera bibliotek zewnętrznych.

Dla programistów platforma Android 3.0 jest dostępna jako komponent pakietu Android SDK, który można pobrać. Platforma do pobrania zawiera bibliotekę Androida i obraz systemu, a także zestaw skórek emulatorów. Aby zacząć programować lub testować Androida w wersji 3.0, pobierz platformę do swojego pakietu SDK za pomocą Menedżera pakietu Android SDK.

Omówienie interfejsu API

Sekcje poniżej zawierają omówienie nowości dla deweloperów w Androidzie 3.0, w tym informacje o nowych funkcjach i zmianach wprowadzonych w interfejsie API platformy od poprzedniej wersji.

Fragmenty

Fragment to nowy komponent platformy, który umożliwia rozdzielenie poszczególnych elementów działania na niezależne moduły, które definiują własny interfejs i cykl życia. Aby utworzyć fragment, musisz rozszerzyć klasę Fragment i wdrożyć kilka metod wywołania zwrotnego cyklu życia, podobnych do Activity. Następnie możesz połączyć wiele fragmentów w jednej aktywności, aby utworzyć interfejs z wieloma panelami, w którym każdy panel zarządza własnym cyklem życia i danymi wejściowymi użytkownika.

Możesz też użyć fragmentu bez udostępniania interfejsu, a zamiast tego użyć go jako instancji roboczej dla działania, np. do zarządzania postępem pobierania, który ma miejsce tylko wtedy, gdy działanie jest w toku.

Dodatkowo:

  • Fragmenty są autonomiczne i można ich używać w różnych działaniach
  • Możesz dodawać, usuwać, zastępować i animować fragmenty wewnątrz aktywności
  • Możesz dodawać fragmenty do stosu wstecznego zarządzanego przez aktywność, zachowując stan fragmentów na bieżąco, gdy są one zmieniane, i umożliwiasz użytkownikowi przechodzenie wstecz między różnymi stanami
  • Dzięki udostępnianiu układów alternatywnych możesz mieszać i dopasowywać fragmenty na podstawie rozmiaru ekranu i orientacji
  • Fragmenty mają bezpośredni dostęp do aktywności w kontenerze i mogą dodawać elementy do paska działań aktywności (omówione poniżej).

Do zarządzania fragmentami w aktywności musisz używać interfejsu FragmentManager, który udostępnia kilka interfejsów API do interakcji z fragmentami, np. znajdowania fragmentów w aktywności i wyrzucania fragmentów z tylnego stosu w celu przywrócenia ich poprzedniego stanu.

Aby wykonać transakcję, np. dodać lub usunąć fragment, musisz utworzyć FragmentTransaction. Następnie możesz wywoływać metody takie jak add() remove() lub replace(). Po zastosowaniu wszystkich zmian, które chcesz wprowadzić w transakcji, musisz wywołać commit(), a system zastosuje do aktywności transakcję fragment.

Więcej informacji o używaniu fragmentów znajdziesz w dokumentacji fragmentów. Kilka przykładów jest też dostępnych w aplikacji Wersja demonstracyjna interfejsu API.

Pasek działań

Pasek działań zastępuje tradycyjny pasek tytułu u góry okna aktywności. Zawiera logo aplikacji w lewym rogu i udostępnia nowy interfejs opcji w menu Opcje. Dodatkowo na pasku działań możesz:

  • dodawać pozycje menu bezpośrednio na pasku działań w postaci „elementów działań”.

    W deklaracji XML dotyczącej elementu menu dodaj atrybut android:showAsAction o wartości "ifRoom". Gdy wystarczy miejsca, element menu wyświetli się bezpośrednio na pasku działań. W przeciwnym razie element zostanie umieszczony w rozszerzonym menu, o czym będzie widoczna ikona menu po prawej stronie paska działań.

  • Zastąp działanie działaniem widżetem (takim jak pole wyszukiwania) i utwórz „widok czynności”.

    W deklaracji XML elementu menu dodaj atrybut android:actionViewLayout z zasobem układu lub atrybut android:actionViewClass z nazwą klasy widżetu. Aby produkt pojawił się na pasku działań, musisz też zadeklarować atrybut android:showAsAction. Jeśli na pasku działań nie ma wystarczającej ilości miejsca, a element wyświetla się w rozszerzonym menu, działa jak zwykły element menu i nie wyświetla widżetu.

  • Dodawanie działania do logo aplikacji i zastępowanie go logo niestandardowym

    Do logo aplikacji automatycznie jest przypisywany identyfikator android.R.id.home, który system przesyła do wywołania zwrotnego onOptionsItemSelected() Twojej aktywności po jego dotknięciu. Wystarczy odpowiedzieć na ten identyfikator w metodzie wywołania zwrotnego, aby wykonać działanie takie jak przejście do aktywności głównej aplikacji.

    Aby zastąpić ikonę logo, określ logo aplikacji w pliku manifestu za pomocą atrybutu android:logo, a potem w aktywności wywołaj parametr setDisplayUseLogoEnabled(true).

  • Dodaj menu nawigacyjne, aby przejść wstecz przez tylny stos fragmentów
  • Dodaj karty lub listę rozwijaną do poruszania się między fragmentami
  • Dostosuj pasek działań za pomocą motywów i tła

Pasek działań jest standardem w przypadku wszystkich aplikacji korzystających z nowego motywu holograficznego. Jest on też dostępny standardowo, gdy ustawisz wartość "11" dla elementu android:minSdkVersion lub android:targetSdkVersion.

Więcej informacji o pasku działań znajdziesz w dokumentacji paska działań. Kilka przykładów jest też dostępnych w aplikacji Wersja demonstracyjna interfejsu API.

Schowek systemowy

Aplikacje mogą teraz kopiować dane (oprócz samego tekstu) i wklejać je do schowka w całym systemie i z niego. Przycinane dane mogą mieć postać zwykłego tekstu, identyfikatora URI lub intencji.

Zapewniając systemowi dostęp do danych, które chce skopiować użytkownik, za pośrednictwem dostawcy treści użytkownik może kopiować złożone treści (np. obrazy lub struktury danych) z Twojej aplikacji i wklejać je do innej aplikacji, która obsługuje ten typ treści.

Aby zacząć korzystać ze schowka, pobierz globalny obiekt ClipboardManager, wywołując getSystemService(CLIPBOARD_SERVICE).

Aby skopiować element do schowka, musisz utworzyć nowy obiekt ClipData, który zawiera co najmniej 1 obiekt ClipData.Item, z których każdy opisuje 1 encję. Aby utworzyć obiekt ClipData zawierający tylko 1 element ClipData.Item, możesz użyć jednej z metod pomocniczych, takich jak newPlainText(), newUri() i newIntent(). Każda z nich zwraca obiekt ClipData wstępnie wczytany z podanymi przez Ciebie obiektami ClipData.Item.

Aby dodać plik ClipData do schowka, przekaż go do setPrimaryClip() na potrzeby instancji ClipboardManager.

Następnie możesz odczytać plik ze schowka (aby go wkleić), wywołując getPrimaryClip() w ClipboardManager. Obsługa otrzymywanego pliku ClipData może być skomplikowana, a zanim spróbujesz je wkleić, musisz upewnić się, że potrafisz obsłużyć dany typ danych w schowku.

W schowku może znajdować się tylko 1 obcięty fragment danych (obiekt ClipData), ale 1 element ClipData może zawierać wiele elementów ClipData.Item.

Więcej informacji znajdziesz w dokumentacji kopiowania i wklejania. Przykład prostej implementacji kopiowania i wklejania w prezentacjach interfejsu API oraz pełniejszą implementację w notatniku.

Przeciągnij i upuść

Nowe interfejsy API upraszczają operacje przeciągania i upuszczania w interfejsie użytkownika aplikacji. Przeciąganie to przenoszenie danych znajdujących się w obiekcie ClipData z jednego miejsca do drugiego. Punktem początkowym i końcowym operacji przeciągania jest View, więc interfejsy API, które bezpośrednio obsługują takie operacje, należą do klasy View.

Przeciąganie i upuszczanie ma cykl życia, który jest definiowany przez kilka takich działań jak ACTION_DRAG_STARTED, ACTION_DRAG_ENTERED i ACTION_DROP, z których każda jest definiowana przez obiekt DragEvent. Każdy widok, który chce uczestniczyć w operacji przeciągania, może nasłuchiwać tych działań.

Aby rozpocząć przeciąganie treści w ramach aktywności, wywołaj funkcję startDrag() w obiekcie View, udostępniając obiekt ClipData reprezentujący dane do przeciągnięcia, obiekt View.DragShadowBuilder, który ułatwia „cienie”, który użytkownicy widzą pod palcami podczas przeciągania, oraz Object, który może udostępniać informacje o przeciąganym obiekcie w widokach, które mogą go odebrać.

Aby zaakceptować przeciągnięty obiekt w View (odebrać „drop”), zarejestruj widok za pomocą OnDragListener, wywołując setOnDragListener(). Gdy w widoku wystąpi zdarzenie przeciągnięcia, system wywołuje funkcję onDrag() dla elementu OnDragListener, który otrzymuje DragEvent opisujący typ przeprowadzonego przeciągania (np. ACTION_DRAG_STARTED, ACTION_DRAG_ENTERED i ACTION_DROP). Podczas przeciągania system wielokrotnie wywołuje parametr onDrag(), aby wyświetlić widok znajdujący się pod przeciągnięciem, aby wygenerować strumień zdarzeń przeciągania. Widok odbiorcy może zapytać o typ zdarzenia dostarczonego do usługi onDragEvent(), wywołując getAction() w interfejsie DragEvent.

Uwaga: zdarzenie przeciągania może zawierać obiekt ClipData, ale nie jest związane ze schowkiem systemowym. Operacja „przeciągnij i upuść” nie powinna nigdy umieszczać przeciągniętych danych w schowku systemowym.

Więcej informacji znajdziesz w dokumentacji przeciągania i upuszczania. Implementację przeciągania i upuszczania możesz też zobaczyć w aplikacjach Wersje demonstracyjne interfejsu API i Honeycomb Gallery.

Widżety

Android 3.0 obsługuje kilka nowych klas widżetów, takich jak GridView, ListView, StackView, ViewFlipper i AdapterViewFlipper, dzięki czemu możesz tworzyć bardziej interaktywne widżety aplikacji na ekranie głównym.

Co więcej, za pomocą nowej funkcji RemoteViewsService możesz tworzyć widżety aplikacji z kolekcjami za pomocą widżetów takich jak GridView, ListView i StackView opartych na danych zdalnych, np. pochodzących od dostawcy treści.

Klasa AppWidgetProviderInfo (zdefiniowana w pliku XML za pomocą elementu <appwidget-provider>) obsługuje też 2 nowe pola: autoAdvanceViewId i previewImage. Pole autoAdvanceViewId umożliwia określenie identyfikatora widoku podrzędnego widżetu aplikacji, który ma być automatycznie przesuwany przez host widżetu aplikacji. Pole previewImage określa podgląd widżetu aplikacji. Jest ono wyświetlane użytkownikowi za pomocą selektora widżetów. Jeśli to pole nie zostanie podane, do wyświetlenia podglądu będzie używana ikona widżetu aplikacji.

Emulator Androida zawiera aplikację o nazwie „Podgląd widżetu”, która ułatwia utworzenie obrazu podglądu widżetu aplikacji (do określania w polu previewImage). Aby utworzyć obraz podglądu, uruchom aplikację, wybierz jej widżet i ustaw sposób wyświetlania obrazu podglądu. Następnie zapisz obraz i umieść go w możliwych do rysowania zasobach aplikacji.

Implementację nowych funkcji widżetu aplikacji możesz zobaczyć w aplikacjach StackView App Widget i Weather List Widget.

Powiadomienia na pasku stanu

Interfejsy API Notification zostały rozszerzone, aby mogły obsługiwać więcej powiadomień na pasku stanu z dużą ilością treści. Nowa klasa Notification.Builder umożliwia łatwe tworzenie obiektów Notification.

Nowe funkcje:

  • Obsługa dużej ikony w powiadomieniu (setLargeIcon()). Zwykle jest to używane w aplikacjach społecznościowych do pokazywania zdjęcia osoby będącej źródłem powiadomienia, a w aplikacjach do multimediów – miniatury albumu.
  • Obsługa układów niestandardowych na pasku stanu przy użyciu setTicker().
  • Obsługa niestandardowych układów powiadomień, które obejmują przyciski ze znakami PendingIntent, co pozwala uzyskać bardziej interaktywne widżety powiadomień. Powiadomienie może na przykład sterować odtwarzaniem muzyki bez rozpoczynania żadnej aktywności.

Moduły wczytywania treści

Nowe interfejsy API platformy ułatwiają asynchroniczne ładowanie danych za pomocą klasy Loader. Możesz go używać w połączeniu z komponentami interfejsu, takimi jak widoki i fragmenty, aby dynamicznie wczytywać dane z wątków instancji roboczych. Podklasa CursorLoader została specjalnie zaprojektowana tak, aby ułatwić Ci wykonywanie takich zadań w przypadku danych opartych na ContentProvider.

Wystarczy zaimplementować interfejs LoaderCallbacks, który będzie odbierać wywołania zwrotne w przypadku zażądania nowego modułu ładowania lub zmiany danych, a następnie wywołać metodę initLoader(), aby zainicjować moduł ładowania dla aktywności lub fragmentu.

Więcej informacji znajdziesz w dokumentacji Loaders. Przykładowy kod z użyciem modułów wczytywania możesz zobaczyć w przykładach LoaderCursor i LoaderThrottle.

Interfejsy API Bluetooth A2DP i zestawów słuchawkowych

Android zawiera teraz interfejsy API dla aplikacji do weryfikowania stanu połączonych urządzeń Bluetooth A2DP i profili zestawów słuchawkowych. Aplikacje mogą na przykład wykrywać, kiedy jest podłączony zestaw słuchawkowy Bluetooth, żeby słuchać muzyki, i odpowiednio powiadamiać użytkownika. Aplikacje mogą też odbierać komunikaty dotyczące poleceń AT konkretnego dostawcy i powiadamiać użytkownika o stanie połączonego urządzenia, np. o niskim poziomie baterii.

Możesz zainicjować odpowiednie BluetoothProfile, wywołując metodę getProfileProxy() ze stałą profilu A2DP lub HEADSET i metodą BluetoothProfile.ServiceListener w celu odbierania wywołań zwrotnych, gdy klient Bluetooth jest podłączony lub rozłączony.

Struktura animacji

Całkowicie nowa, elastyczna platforma animacji umożliwia animowanie dowolnych właściwości dowolnego obiektu (View, Drawable, Fragment, Object lub dowolnego innego). Pozwala zdefiniować kilka aspektów animacji, np.:

  • Czas działania
  • Powtórz ilość i zachowanie
  • Typ interpolacji czasowej
  • Animator ustawia odtwarzanie animacji razem, sekwencyjnie lub po określonych opóźnieniach.
  • Opóźnienie odświeżania ramki

Domyślnie możesz zdefiniować te oraz inne aspekty animacji dla wartości int, liczby zmiennoprzecinkowej i szesnastkowych kolorów obiektu. Oznacza to, że gdy obiekt ma pole właściwości jednego z tych typów, możesz z czasem zmienić jego wartość, aby wpłynąć na animację. Aby animować wartość innego typu, informujesz system, jak ma obliczać wartości tego typu, implementując interfejs TypeEvaluator.

Do animowania wartości właściwości możesz używać dwóch animatorów: ValueAnimator i ObjectAnimator. Parametr ValueAnimator oblicza wartości animacji, ale nie wie, jaki konkretnie obiekt lub właściwość, które w efekcie są animowane, Po prostu wykonuje obliczenia, wysłuchaj zmian i przetwarzaj dane zgodnie z własnymi preferencjami. ObjectAnimator to podklasa klasy ValueAnimator, która umożliwia ustawianie animacji obiektu i właściwości oraz obsługuje wszystkie działania związane z animacjami. Musisz więc przyznać ObjectAnimator obiekt do animacji, właściwość obiektu, która będzie się zmieniać z upływem czasu, oraz zestaw wartości, które będą stosowane do tej właściwości wraz z upływem czasu, a następnie uruchom animację.

Dodatkowo klasa LayoutTransition umożliwia automatyczne przejście w przypadku zmian wprowadzonych w układzie aktywności. Aby włączyć przejścia w części układu, utwórz obiekt LayoutTransition i ustaw go w dowolnym elemencie ViewGroup, wywołując setLayoutTransition(). Dzięki temu po każdym dodaniu elementów do grupy lub ich usunięciu będą się wyświetlać domyślne animacje. Aby określić niestandardowe animacje, wywołaj setAnimator() w LayoutTransition i podaj niestandardowy parametr Animator, taki jak ValueAnimator lub ObjectAnimator omówiony powyżej.

Więcej informacji znajdziesz w dokumentacji Animacja właściwości. Możesz też zobaczyć kilka przykładów z użyciem interfejsów API animacji w aplikacji API Demos.

Rozszerzona platforma UI

  • Jednokrotny wybór w przypadku ListView i GridView

    Nowy tryb CHOICE_MODE_MULTIPLE_MODAL w setChoiceMode() umożliwia użytkownikom wybranie wielu elementów z ListView lub GridView. W połączeniu z paskiem działań użytkownicy mogą wybrać wiele elementów, a potem wybrać działanie do wykonania z listy opcji na pasku działań (która przekształciła się w tryb działania jednokrotnego wyboru).

    Aby umożliwić wybór jednokrotnego wyboru, zadzwoń pod numer setChoiceMode(CHOICE_MODE_MULTIPLE_MODAL) i zarejestruj użytkownika MultiChoiceModeListener u operatora setMultiChoiceModeListener().

    Gdy użytkownik przytrzyma i przytrzyma element, pasek działań przełączy się w tryb działań jednokrotnego wyboru. System powiadamia MultiChoiceModeListener o wybraniu elementów, wywołując metodę onItemCheckedStateChanged().

    Przykład wyboru wielokrotnego wyboru znajdziesz w klasie List15.java w przykładowej aplikacji interfejsu API Demos.

  • Nowe interfejsy API do przekształcania widoków

    Nowe interfejsy API pozwalają łatwo stosować przekształcenia 2D i 3D w widokach w układzie aktywności. Tworzenie nowych przekształceń jest możliwe dzięki zestawowi właściwości obiektu, które określają m.in. położenie układu, orientację i przezroczystość widoku.

    Nowe metody ustawiania właściwości widoku to między innymi: setAlpha(), setBottom(), setLeft(), setRight(), setBottom(), setPivotX(), setPivotY(), setRotationX(), setRotationY(), setScaleX(), setScaleY(), setAlpha().

    Niektóre metody mają też odpowiedni atrybut XML, który możesz określić w pliku układu, aby zastosować domyślne przekształcenie. Dostępne atrybuty: translationX, translationY, rotation, rotationX, rotationY, scaleX, scaleY, transformPivotX, transformPivotY i alpha.

    Wykorzystując niektóre z tych nowych właściwości widoku w połączeniu z nową strukturą animacji (opisaną powyżej), możesz łatwo zastosować w widokach niestandardowe animacje. Aby np. obrócić widok wokół osi Y, podaj w polu ObjectAnimator właściwość View, właściwość „rotationY” oraz wartości początkowe i końcowe:

    Kotlin

    ObjectAnimator.ofFloat(myView, "rotationY", 0f, 360f).apply {
        duration = 2000
        start()
    }
    

    Java

    ObjectAnimator animator = ObjectAnimator.ofFloat(myView, "rotationY", 0, 360);
    animator.setDuration(2000);
    animator.start();
    
  • Nowe motywy holograficzne

    Standardowy widżet i ogólny wygląd interfejsu zostały zmienione i obejmują nowy, „holograficzny” motyw interfejsu. System zastosuje nowy motyw za pomocą standardowego systemu stylów i motywów.

    Każda aplikacja kierowana na platformę Androida 3.0 – przez ustawienie wartości android:minSdkVersion lub android:targetSdkVersion na "11" – domyślnie dziedziczy motyw holograficzny. Jeśli jednak aplikacja zastosuje własny motyw, zastąpi on go, chyba że zaktualizujesz style, tak aby odziedziczyły motyw holograficzny.

    Aby zastosować motyw holograficzny do poszczególnych działań lub odziedziczyć go we własnych definicjach motywu, użyj jednego z kilku nowych motywów Theme.Holo. Jeśli Twoja aplikacja jest zgodna z wersją Androida starszą niż 3.0 i stosuje motywy niestandardowe, wybierz motyw na podstawie wersji platformy.

  • Nowe widżety
    • AdapterViewAnimator

      Klasa podstawowa elementu AdapterView, który wykonuje animacje podczas przełączania się między widokami.

    • AdapterViewFlipper

      Prosta animacja ViewAnimator, która pojawia się między co najmniej 2 widokami, które zostały do niej dodane. W danym momencie pokazywane jest tylko 1 dziecko. Na żądanie może automatycznie przełączać się między poszczególnymi elementami w regularnych odstępach czasu.

    • CalendarView

      Umożliwia użytkownikom wybieranie dat z kalendarza przez ich dotknięcie, a następnie przewijanie i przesuwanie kalendarza do wybranej daty. Możesz skonfigurować zakres dat dostępnych w widżecie.

    • ListPopupWindow

      Zakotwicza się do widoku hosta i wyświetla listę opcji, np. listy sugestii podczas wpisywania w widoku EditText.

    • NumberPicker

      Pozwala użytkownikowi wybrać liczbę ze wstępnie zdefiniowanego zakresu. Widżet zawiera pole do wprowadzania danych oraz przyciski w górę i w dół umożliwiające wybór liczby. Dotykając pola do wprowadzania danych, użytkownik może przewijać wartości lub dotknąć ponownie, by bezpośrednio edytować bieżącą wartość. Umożliwia też mapowanie pozycji na ciągi, dzięki czemu zamiast pozycji indeksu wyświetla się odpowiedni ciąg znaków.

    • PopupMenu

      Wyświetla Menu w wyskakującym okienku zakotwiczonym do widoku. Wyskakujące okienko pojawi się pod widokiem reklamy zakotwiczonej, jeśli jest tam miejsce, lub nad nim, jeśli go nie ma. Jeśli widoczny jest edytor IME, wyskakujące okienko nie nakłada się na niego, dopóki użytkownik nie kliknie menu.

    • SearchView

      Zawiera pole wyszukiwania, które możesz skonfigurować tak, aby zapytania były dostarczane do konkretnego działania i wyświetlać sugestie wyszukiwania (w taki sam sposób jak tradycyjne okno wyszukiwania). Ten widżet jest szczególnie przydatny, gdy chcesz dodać widżet wyszukiwania na pasku działań. Więcej informacji znajdziesz w artykule na temat tworzenia interfejsu wyszukiwania.

    • StackView

      Widok, który wyświetla jego elementy podrzędne w stosie 3D i pozwala użytkownikom przechodzić między widokami jak rolodex.

Grafika

  • Grafika 2D z akceleracją sprzętową

    Możesz teraz włączyć mechanizm renderowania OpenGL w przypadku aplikacji, ustawiając dla swojej aplikacji atrybut android:hardwareAccelerated="true" w elemencie <application> elementu manifestu lub w poszczególnych elementach <activity>.

    Ta flaga pomaga aplikacjom, umożliwiając szybsze rysowanie. Zapewnia to płynniejsze animacje, płynniejsze przewijanie, większą wydajność i lepsze reagowanie na interakcje użytkownika.

  • Wyświetlanie obsługi warstw sprzętu i oprogramowania

    Domyślnie View nie ma określonej warstwy. Za pomocą atrybutu setLayerType() lub layerType możesz określić, że dla widoku danych będzie działać warstwa sprzętowa lub programowa określona za pomocą wartości LAYER_TYPE_HARDWARE i LAYER_TYPE_SOFTWARE.

    Warstwa sprzętowa jest oparta na specyficznej dla sprzętu teksturze (zwykle jest to FBO Frame Buffer Objects lub FBO na sprzęcie OpenGL) i powoduje, że widok jest renderowany za pomocą sprzętowego potoku renderowania Androida, ale tylko wtedy, gdy w hierarchii widoków włączona jest akceleracja sprzętowa. Gdy akceleracja sprzętowa jest wyłączona, warstwy sprzętowe działają dokładnie tak samo jak warstwy oprogramowania.

    Warstwa oprogramowania jest oparta na bitmapie i powoduje, że widok jest renderowany za pomocą programowego potoku renderowania Androida, nawet jeśli jest włączona akceleracja sprzętowa. Kiedy drzewo widoku, którego dotyczy problem, często się aktualizuje, należy unikać warstw oprogramowania. Każda aktualizacja będzie wymagać ponownego wyrenderowania warstwy oprogramowania, co może działać wolniej.

    Więcej informacji znajdziesz w dokumentacji LAYER_TYPE_HARDWARE i LAYER_TYPE_SOFTWARE.

  • Mechanizm grafiki 3D Renderscript

    Renderscript to środowisko wykonawcze 3D, które udostępnia zarówno interfejs API do tworzenia scen 3D, jak i specjalny, niezależny od platformy język programu do cieniowania, który zapewnia maksymalną wydajność. Korzystając z Renderscript, możesz przyspieszyć operacje graficzne i przetwarzanie danych. Renderscript to idealny sposób na tworzenie efektów 3D o wysokiej wydajności na potrzeby aplikacji, tapet, karuzel i innych elementów.

    Więcej informacji znajdziesz w dokumentacji Renderowania i obliczenia 3D przy użyciu Renderscript.

Multimedia

  • Film poklatkowy

    Interfejsy Camcorder API obsługują teraz możliwość nagrywania filmów w trybie poklatkowym. Pole setCaptureRate() określa szybkość, z jaką klatki mają być przechwytywane.

  • Obsługa tekstur w przypadku strumieni obrazów

    Nowa wersja SurfaceTexture umożliwia przechwytywanie strumienia obrazu jako tekstury OpenGL ES. Wywołując w instancji Camera funkcję setPreviewTexture(), możesz określić parametr SurfaceTexture, który będzie służyć do odtwarzania filmu lub tworzenia klatek z podglądu z kamery.

  • Transmisja na żywo przez HTTP

    Aplikacje mogą teraz przekazywać URL playlisty M3U do platformy multimediów, by rozpocząć sesję transmisji na żywo przez HTTP. Platforma multimediów obsługuje większość specyfikacji transmisji na żywo HTTP, w tym adaptacyjną szybkość transmisji bitów. Więcej informacji znajdziesz w sekcji Obsługiwane formaty multimediów.

  • Dane EXIF

    ExifInterface zawiera nowe pola ustawień przysłony, ISO i czasu ekspozycji.

  • Profile kamery

    Nowa metoda hasProfile() i kilka profili jakości wideo (np. QUALITY_1080P, QUALITY_720P, QUALITY_CIF i inne) umożliwiają określenie opcji jakości kamery.

  • Przesyłanie plików do mediów cyfrowych

    Platforma oferuje wbudowaną obsługę protokołu MTP/PTP (Media/Picture Transfer Protocol) przez USB, co pozwala użytkownikom łatwo przesyłać dowolne pliki multimedialne między urządzeniami i komputerami. Deweloperzy mogą dalej korzystać z tej możliwości, tworząc aplikacje umożliwiające użytkownikom tworzenie plików multimedialnych, które użytkownicy zechcą przesyłać lub udostępniać na różnych urządzeniach, oraz nimi zarządzać.

  • Zarządzanie prawami cyfrowymi (DRM)

    Nowe rozszerzalne platformy zarządzania prawami cyfrowymi (DRM) do sprawdzania i egzekwowania praw cyfrowych. Zastosowano je w 2 warstwach architektury:

    • Interfejs DRM Framework API, który jest dostępny dla aplikacji i działa przez maszynę wirtualną Dalvik na potrzeby standardowych aplikacji.
    • Natywny menedżer DRM kodu, który implementuje interfejs API platformy i udostępnia interfejs wtyczkom DRM do obsługi zarządzania prawami i odszyfrowywania w przypadku różnych schematów DRM.

    Dla deweloperów aplikacji platforma ta zapewnia abstrakcyjny, ujednolicony interfejs API, który upraszcza zarządzanie treściami chronionymi. Interfejs API ukrywa złożoność operacji związanych z DRM i umożliwia spójny tryb działania w przypadku treści chronionych i niechronionych oraz różnych schematów DRM.

    Producenci urządzeń, właściciele treści i dostawcy internetowych mediów cyfrowych mogą korzystać z interfejsu API wtyczki platformy DRM, który umożliwia dodanie obsługi wybranego schematu DRM do systemu Android, co umożliwia bezpieczne egzekwowanie ochrony treści.

    Wersja testowa nie zawiera żadnych natywnych wtyczek DRM do sprawdzania i egzekwowania praw cyfrowych. Producenci mogą jednak dostarczać wtyczki z DRM.

    Wszystkie interfejsy API DRM znajdziesz w pakiecie android.drm.

Obsługa klawiatury

  • Obsługa modyfikatorów Control, Meta, Caps Lock, Num Lock i Scroll Lock. Więcej informacji znajdziesz w sekcji META_CTRL_ON i powiązanych polach.
  • Obsługa klawiatur w wersji komputerowej, w tym obsługa klawiszy takich jak Escape, Home, End, Delete i innych. Aby ustalić, czy kluczowe zdarzenia są wywoływane z pełnej klawiatury, wyślij zapytanie do getKeyboardType() i sprawdź KeyCharacterMap.FULL
  • TextView obsługuje teraz wycinanie, kopiowanie, wklejanie i zaznaczanie przy użyciu kombinacji klawiszy Control+X, Control+C, Control+V i Control+A. Obsługuje również strony PageUp/PageDown, Home/End oraz wybór tekstu za pomocą klawiatury.
  • KeyEvent dodaje kilka nowych metod, które ułatwiają prawidłowe i spójne sprawdzanie stanu modyfikatora klucza. Patrz: hasModifiers(int), hasNoModifiers(), metaStateHasModifiers(), metaStateHasNoModifiers().
  • Aplikacje mogą implementować niestandardowe skróty klawiszowe, tworząc podklasy Activity, Dialog lub View i implementując onKeyShortcut(). Platforma wywołuje tę metodę za każdym razem, gdy klucz zostanie połączony z klawiszem Ctrl. Tworząc menu opcji, możesz rejestrować skróty klawiszowe, ustawiając atrybut android:alphabeticShortcut lub android:numericShortcut dla każdego elementu <item> (albo za pomocą setShortcut()).
  • Android 3.0 zawiera nowe urządzenie „klawiatura wirtualna” o identyfikatorze KeyCharacterMap.VIRTUAL_KEYBOARD. Klawiatura wirtualna ma amerykańską mapę klawiszy w stylu pulpitu, co przydaje się do syntetyzowania kluczowych zdarzeń na potrzeby testowania danych wejściowych.

Zdarzenia podzielonego dotyku

Wcześniej tylko jeden widok mógł jednocześnie akceptować zdarzenia dotknięcia. Android 3.0 obsługuje dzielenie zdarzeń dotyku między widokami, a nawet oknami, dzięki czemu różne widoki mogą akceptować jednoczesne zdarzenia dotknięcia.

Zdarzenia podziału dotknięcia są domyślnie włączone, gdy aplikacja jest kierowana na Androida 3.0. gdy aplikacja ustawi wartość atrybutu android:minSdkVersion lub android:targetSdkVersion na "11".

Umożliwiają jednak wyłączenie podziału zdarzeń dotknięcia w widokach w określonych grupach widoków i w różnych oknach.

  • Atrybut android:splitMotionEvents w grupach widoków pozwala wyłączyć zdarzenia podzielonego dotknięcia, które występują między widokami podrzędnymi w układzie. Przykład:
    <LinearLayout android:splitMotionEvents="false" ... >
        ...
    </LinearLayout>
    

    Dzięki temu w widokach podrzędnych w układzie liniowym nie można dzielić zdarzeń kliknięcia – tylko jeden widok może odbierać zdarzenia kliknięcia w danym momencie.

  • Właściwość stylu android:windowEnableSplitTouch umożliwia wyłączenie podziału zdarzeń dotknięcia w różnych oknach przez zastosowanie ich do motywu aktywności lub całej aplikacji. Przykład:
    <style name="NoSplitMotionEvents" parent="android:Theme.Holo">
        <item name="android:windowEnableSplitTouch">false</item>
        ...
    </style>
    

    Po zastosowaniu tego motywu do elementu <activity> lub <application> akceptowane są tylko zdarzenia dotknięcia w bieżącym oknie aktywności. Na przykład: jeśli wyłączysz podział zdarzeń dotyku w różnych oknach, pasek systemu nie może odbierać zdarzeń dotknięcia w tym samym czasie co aktywność. Nie ma to wpływu na to, czy wyświetlenia w ramach aktywności mogą dzielić zdarzenia dotknięcia – domyślnie aktywność nadal może dzielić zdarzenia kliknięcia między różne widoki.

    Więcej informacji o tworzeniu motywu znajdziesz w artykule Stosowanie stylów i motywów.

WebKit,

  • Nowa klasa WebViewFragment do utworzenia fragmentu składającego się z WebView.
  • Nowe metody WebSettings:
    • setDisplayZoomControls() umożliwia ukrycie elementów sterujących powiększeniem na ekranie, a jednocześnie umożliwia użytkownikowi powiększanie za pomocą gestów palcami (wartość setBuiltInZoomControls() musi być ustawiona true).
    • Nowa metoda WebSettings (setEnableSmoothTransition()) umożliwia włączenie płynnych przejść podczas przesuwania i powiększania. Gdy ta funkcja jest włączona, WebView wybiera rozwiązanie, które maksymalizuje wydajność (np. treść komponentu WebView może się nie aktualizować podczas przenoszenia).
  • Nowe metody WebView:
    • onPause(), aby wstrzymać przetwarzanie powiązane z komponentem WebView, gdy zostanie on ukryty. Jest to przydatne, aby zmniejszyć niepotrzebny ruch związany z procesorem lub siecią, gdy komponent WebView nie działa na pierwszym planie.
    • onResume(), aby wznowić przetwarzanie powiązane z komponentem WebView, które zostało wstrzymane podczas onPause().
    • saveWebArchive() umożliwia zapisanie bieżącego widoku na urządzeniu w postaci archiwum internetowego.
    • showFindDialog() rozpoczyna wyszukiwanie tekstu w bieżącym widoku.

Przeglądarka

Aplikacja Internet dodaje następujące funkcje do obsługi aplikacji internetowych:

  • Rejestrowanie multimediów

    Zgodnie ze specyfikacją HTML Media Capture przeglądarka umożliwia aplikacjom internetowym uzyskiwanie dostępu do funkcji nagrywania dźwięku, obrazu i wideo na urządzeniu. Na przykład ten kod HTML umożliwia użytkownikowi zrobienie zdjęcia, które chce przesłać:

    <input type="file" accept="image/*;capture=camera" />
    

    Użytkownik może też wykluczyć parametr capture=camera, by przechwycić nowe zdjęcie aparatem lub wybrać je z urządzenia (np. z aplikacji Galeria).

  • Orientacja urządzenia

    Zgodnie ze specyfikacją Device Orientation Event przeglądarka zezwala aplikacjom internetowym na nasłuchiwanie zdarzeń DOM, które dostarczają informacji o fizycznej orientacji i ruchu urządzenia.

    Orientacja urządzenia jest wyrażana za pomocą osi x, y i z, w stopniach, a ruch jest wyrażany za pomocą danych o przyspieszeniu i prędkości obrotu. Strona internetowa może zarejestrować udział w wydarzeniach związanych z orientacją, wywołując window.addEventListener o typie zdarzenia "deviceorientation", oraz rejestrować zdarzenia ruchu, rejestrując typ zdarzenia "devicemotion".

  • Przekształcenia 3D CSS

    Zgodnie z definicją zawartą w specyfikacji modułu przekształcania CSS 3D przeglądarka umożliwia przekształcanie elementów renderowanych przez CSS w trójwymiarowy sposób.

Narzędzia JSON

Nowe klasy (JsonReader i JsonWriter) ułatwiają odczytywanie i zapisywanie strumieni JSON. Nowe interfejsy API uzupełniają klasy org.json, które obsługują dokument w pamięci.

Instancję obiektu JsonReader możesz utworzyć, wywołując jego metodę konstruktora i przekazując InputStreamReader, który przekazuje ciąg znaków JSON. Następnie zacznij odczytywać obiekt, wywołując beginObject(), odczytuj nazwę klucza za pomocą nextName(), odczytuj wartość za pomocą metod niezależnie od typu, takich jak nextString() i nextInt(), i kontynuuj wykonywanie tych czynności, gdy hasNext() ma wartość prawda.

Instancję obiektu JsonWriter możesz utworzyć, wywołując jego konstruktor i przekazując odpowiedni OutputStreamWriter. Następnie zapisz dane JSON w sposób podobny do odczytu za pomocą name(), aby dodać nazwę właściwości i odpowiedniej metody value(), aby dodać odpowiednią wartość.

Te klasy są domyślnie rygorystyczne. Metoda setLenient() w każdej klasie konfiguruje je tak, aby były bardziej liberalne w zakresie akceptowanych elementów. Ten tryb łagodnej analizy jest też zgodny z domyślnym parserem org.json.

Stałe nowych cech

Element manfest <uses-feature> powinien służyć do informowania podmiotów zewnętrznych (np. Google Play) o zestawie funkcji sprzętu i oprogramowania, od których zależy Twoja aplikacja. W tej wersji Android dodaje te nowe stałe, które aplikacje mogą deklarować za pomocą tego elementu:

  • "android.hardware.faketouch"

    Zadeklarowanie wskazuje, że aplikacja jest zgodna z urządzeniem, które ma emulowany ekran dotykowy (lub lepszy). Urządzenie z emulowanym ekranem dotykowym ma system wprowadzania danych, który może emulować podzbiór funkcji ekranu dotykowego. Przykładem takiego systemu wejściowego jest mysz lub pilot obsługujący kursor na ekranie. Takie systemy wejściowe obsługują podstawowe zdarzenia dotyku, takie jak kliknięcie w dół, kliknięcie w górę czy przeciągnięcie. Bardziej złożone typy wprowadzania danych (np. gesty, przesuwania palcem itp.) mogą być jednak trudniejsze lub wręcz niemożliwe na urządzeniach wywołujących fake-touch (a gesty wielodotykowe na pewno nie są możliwe).

    Jeśli Twoja aplikacja nie wymaga skomplikowanych gestów i nie chcesz, aby była ona filtrowana z urządzeń z emulowanym ekranem dotykowym, zadeklaruj "android.hardware.faketouch" za pomocą elementu <uses-feature>. Dzięki temu aplikacja będzie dostępna na jak największej liczbie urządzeń, również tych, które obsługują wyłącznie emulowany ekran dotykowy.

    Wszystkie urządzenia z ekranem dotykowym obsługują również "android.hardware.faketouch", ponieważ funkcje ekranu dotykowego stanowią nadzwyczajny zbiór funkcji faketouch. Jeśli więc nie potrzebujesz ekranu dotykowego, dodaj element <uses-feature> służący do wykrywania faketouch.

Nowe uprawnienia

  • "android.permission.BIND_REMOTEVIEWS"

    Musi to być uprawnienie wymagane w elemencie manifestu <service> w przypadku implementacji RemoteViewsService. Gdy na przykład tworzysz widżet aplikacji, który wykorzystuje RemoteViewsService do wypełniania widoku kolekcji, wpis w pliku manifestu może wyglądać tak:

    <service android:name=".widget.WidgetService"
        android:exported="false"
        android:permission="android.permission.BIND_REMOTEVIEWS" />
    

Nowe technologie platformowe

  • Miejsce na dane
    • Obsługa systemu plików ext4 umożliwia włączenie wbudowanej pamięci eMMC.
    • System plików FUSE do obsługi urządzeń MTP.
    • Obsługa trybu hosta USB w celu obsługi klawiatur i koncentratorów USB.
    • Obsługa MTP/PTP
  • Jądro Linuksa
    • Uaktualniono do wersji 2.6.36
  • Maszyna wirtualna Dalvik
    • Nowy kod do obsługi i optymalizacji pod kątem SMP
    • Różne ulepszenia infrastruktury JIT
    • Ulepszenia dotyczące zbierania śmieci:
      • Dopasowane do SMP
      • Obsługa większych rozmiarów sterty
      • Ujednolicona obsługa map bitowych i buforów bajtów
  • Główne biblioteki Dalvik
    • Nowa, znacznie szybsza implementacja NIO (nowoczesnej biblioteki I/O)
    • Ulepszone komunikaty o wyjątkach
    • Poprawianie poprawności i skuteczności przez cały czas trwania filmu.

Raport Różnice w interfejsach API

Szczegółowe informacje o wszystkich zmianach dotyczących interfejsów API w Androidzie 3.0 (poziom API 11) znajdziesz w raporcie Różnice w interfejsie API.

Poziom API

Platforma Android 3.0 udostępnia zaktualizowaną wersję interfejsu API platformy. Do interfejsu Android 3.0 API jest przypisany identyfikator w postaci liczby całkowitej (11), który jest przechowywany w samym systemie. Ten identyfikator, nazywany „poziomem interfejsu API”, pozwala systemowi przed jej zainstalowaniem prawidłowo określić, czy aplikacja jest z nim zgodna.

Aby korzystać z interfejsów API wprowadzonych w Androidzie 3.0, należy skompilować aplikację do biblioteki Androida, która jest dostępna na platformie SDK Androida 3.0. W zależności od potrzeb może być też konieczne dodanie atrybutu android:minSdkVersion="11" do elementu <uses-sdk> w pliku manifestu aplikacji. Jeśli Twoja aplikacja jest przeznaczona do działania wyłącznie na Androidzie 2.3 lub nowszym, zadeklarowanie tego atrybutu uniemożliwia jej zainstalowanie we wcześniejszych wersjach platformy.

Więcej informacji znajdziesz w artykule Co to jest poziom interfejsu API.