rozgłaszanych w określonym czasie w przyszłości, alarmy nie są kasowane na skutek uśpienia urządzenia, ale znikają po jego wyłączeniu • mogą być jednorazowe, powtarzalne, dokładne lub niedokładne oraz budzić urządzenie z uśpienia • w przykładzie, najpierw rejestrujemy BroadcastReceivera – odbiorcę alarmu • dalej, rejestrujemy alarm w usłudze systemowej AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(ctx, AlarmBroadcastReceiver.class); PendingIntent pi = PendingIntent.getBroadcast(ctx, 666, intent, 0); Calendar cal = Calendar.getInstance(); cal.add(Calendar.SECOND, 10); am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pi); • alarm powtarzany zlecamy poprzez metodę setRepeating(), będzie zgłaszany co określony czas, do momentu wywołania cancel() • za pomocą setInexactRepeating() możemy uzyskać mniej dokładne, ale tańsze alarmy, których faktyczny czas zgłoszeń będzie różnił się od założonego
ich rozmiar ogranicza bounding box (płótno do naszej dyspozycji) a składają się z tradycyjnego układu kontrolek graficznych • widżet to w najprostszym ujęciu, specjalny broadcast receiver sterujący widokami hostowanymi na pulpicie, które nie są częścią procesu naszej aplikacji • ekran główny jest podzielony na komórki, które może zajmować widżet – z uwagi na orientację pionową i poziomą, definiujemy minimalne wymiary ze wzoru (74*liczba_komórek)-2 [dp] • konfiguracja widżetu dokonujemy za pomocą pliku, np. /res/xml/widget_info.xml <?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="294dp" android:minHeight="72dp" android:updatePeriodMillis="1800000" android:initialLayout="@layout/widget"> </appwidget-provider> • Android 3.1 wprowadził możliwość dowolnej zmiany rozmiaru widżetów, wystarczy dodać do konfiguracji android:resizeMode="horizontal|vertical" • layout widżetu określamy podobnie jak dotychczas, z drobnymi ograniczeniami (nie wszystkie widoki i layouty są dostępne*) w pliku XML w /res/layout
odpowiedni wpis w manifeście <receiver android:name=".WidgetProvider" android:label="@string/widget_desc" android:icon="@drawable/ic_launcher"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_info" /> </receiver> • określamy powyżej klasę broadcast receivera, nazwę i ikonkę na liście widżetów, filtr domyślnych intencji oraz plik konfiguracyjny • możemy wysyłać własne broadcasty zlecające aktualizacje widżetów, wystarczy dodać w manifeście filtr intencji z naszą akcją <intent-filter> <action android:name="MY.ACTION"/> </intent-filter> • i rozesłać broadcast, który zostanie odebrany w onReceive() Intent intent = new Intent("MY.ACTION"); context.sendBroadcast(intent);
muszą być współdzielone pomiędzy aplikacjami, uzyskujemy dzięki niemu abstrakcję od fizycznej postaci danych (SQLite, API usługi sieciowej, plik w pamięci) • najpopularniejsze wbudowane komponenty udostępniające dane to MediaStore, CallLog, Browser, ContactsContract, Settings, CalendarContract • URI o postaci <prefix>://<authority>/<data>/<id> identyfikuje dane, np. content://as.books/dictionaries/1 – jest to pierwszy argument wywołań metod modułu ContentResolver, prowadzącego interakcję z dostawcami • dostęp do konkretnych danych wymaga znajomości typów kolumn oraz identyfikatora _ID rekordu w bazie danych
robienia zdjęć przez dane urządzenie <uses-feature android:name="android.hardware.camera" /> • najłatwiej jest skorzystać z wbudowanej aplikacji kamery // odpalamy intencje niejawna Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Uri photoUri = getContentResolver().insert(android.provider.MediaStore.Images.Media .EXTERNAL_CONTENT_URI, new ContentValues()); intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); startActivityForResult(intent, INTENT_RESULT_CODE); // korzystamy z dostepu do zdjecia w pamieci po odebraniu rezultatu InputStream stream = getContentResolver().openInputStream(photoUri); Bitmap bmp = BitmapFactory.decodeStream(stream); imageView.setImageBitmap(bmp);
i grafik promocyjnych • rejestracja konta w Google Play ($25) • podpisanie cyfrowo paczki • wprowadzenie aplikacji do sklepu • śledzenie sprzedaży w konsoli wydawcy (developer console) • zgodność z regulaminem i zasadami • 15-minutowe okno czasowe refundacji • nieograniczona liczba reinstalacji • sprzedawanie aplikacji, in-app billing • konkurencyjne sklepy to np. Amazon Appstore, GetJar, Samsung Apps