Pokrocile programovani na platforme Java, letní semestr 2012
Transkript
JAVA Android Java, letní semestr 2012 23.5.2012 Přehled ● kompletní platforma pro mobilní zařízení – ● ● ● původně vyvíjen firmou Android, Inc. 2005 – koupeno Googlem 2007 – Open Handset Alliance – ● založená na Linuxu Google, výrobci HW, výrobci SW,... http://developer.android.com/ – – – dokumentace tutoriály nástroje ● ● SDK plugin pro Eclipse – existují „3rd-party“ pluginy pro další IDE ● – ... Java, letní semestr 2012 23.5.2012 př. pro NetBeans http://kenai.com/projects/nbandroid Java vs. Android ● ...je to Java nebo ne...? ano i ne – ● ● ● programy se (primárně) píší v Javě pak se přeloží do byte-kódu (.class) ten se přeloží do Dalvik byte-kódu (.dex) – ● záleží na „úhlu pohledu“ jiný než Java byte-kód ten se vykonává na Dalvik Virtual Machine – jiná než Java Virtual Machine Java, letní semestr 2012 23.5.2012 Struktura platformy zdroj: http://developer.android.com/guide/basics/what-is-android.html Java, letní semestr 2012 23.5.2012 Odbočka: nativní aplikace ● programy lze psát i v C/C++ – – není to primární způsob nutno stáhnout oddělené NDK ● SDK podporuje jen programy v „Javě“ Java, letní semestr 2012 23.5.2012 Vytvoření projektu ● z IDE – ● z příkazové řádky – ● New project... android create project --package com.example.helloandroid --activity HelloAndroid --target 2 path <path-to-your-project>/HelloAndroid „parametry“ projektu – Application Name ● – Package Name ● ● – lidsky čitelné jméno „kořenový“ balíček, slouží i jako identifikátor aplikace nutno dodržovat konvenci pro pojmenování Target (min SDK version) ● minimální požadovaný „API level“ Java, letní semestr 2012 23.5.2012 Struktura aplikace ● Activities – – ● Views – ● zpřístupnění dat jiným aplikacím Broadcast Intent Receivers – ● služby bez UI běžící dlouhodobě na pozadí Content providers – ● asynchronní zprávy Services – ● elementy uživatelského rozhraní Intents – ● komponenty UI vstupní bodu do aplikace poslouchání na broadcasty (např. oznámení o nízkém stavu baterie (HomeScreen) Widgets interaktivní komponenty na „ploše“ Java, letní semestr 2012 – 23.5.2012 Struktura projektu ● manifest – – AndroidManifest.xml popis aplikace ● ● ● komponenty požadavky … <?xml version="1.0" encoding="utf-8"?> <manifest ... > <application android:icon="@drawable/app_icon.png" ... > <activity android:name="com.example.project.ExampleActivity" android:label="@string/example_label" ... > </activity> ... </application> </manifest> Java, letní semestr 2012 23.5.2012 Struktura projektu ● zdroje (resources) – podadresáře v adresáři res ● drawable – – ● values – – ● řetězce … layouts – – obrázky ... obrazovky třída R ● ● generovaná třída obsahuje identifikátory zdrojů – – Java, letní semestr 2012 23.5.2012 jako statické atributy používají se v kódu Struktura projektu ● adresáře zdrojů mohou mít varianty – – určují se podle přípon drawable-hdpi, drawable-ldpi, drawable-mdpi ● – další přípony ● ● ● ● – – obrázky pro vysoké, nízké, střední rozlišení displaye land, port – orientace displaye cs, en, fr, … – jazyk zařízení small, normal, large – velikost displaye ... přípony lze kombinovat př: ● ● ● ● res/values-de/ res/values-cs/ res/drawable-cs/ res/drawable-en-rUK/ Java, letní semestr 2012 23.5.2012 Aktivity ● ● potomek android.app.Activity okno aplikace – může sloužit i jako vstupní bod do aplikace ● ● launcher vzhled se typicky popisuje jako xml soubor – v res/layout Java, letní semestr 2012 23.5.2012 Hello World (1) import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class HelloAndroid extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText("Hello, Android"); setContentView(tv); } } Java, letní semestr 2012 23.5.2012 Hello World (2) import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class HelloAndroid extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } } Java, letní semestr 2012 23.5.2012 Hello World (2) res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/and roid" jednoznačné ID android:id="@+id/textview" android:layout_width="fill_parent" android:layout_height="fill_parent" reference android:text="@string/hello"/> res/values/strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello, Android! I am a string resource!</string> <string name="app_name">Hello, Android</string> </resources> Java, letní semestr 2012 23.5.2012 Layout ● ● obdobně jako ve Swingu LinearLayout – skládá prvky „do řady“ ● ● ● RelativeLayout – – ● ● ● ● android:orientation="vertical" android:orientation="horizontal" určování polohy relativně vůči dalším prvkům příklad na dalším slidu TableLayout GridLayout TabLayout ListView Java, letní semestr 2012 23.5.2012 RelativeLayout příklad <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/label" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Type here:"/> <EditText android:id="@+id/entry" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@android:drawable/editbox_background" android:layout_below="@id/label"/> <Button android:id="@+id/ok" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/entry" android:layout_alignParentRight="true" android:layout_marginLeft="10dip" android:text="OK" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/ok" android:layout_alignTop="@id/ok" android:text="Cancel" /> </RelativeLayout> Java, letní semestr 2012 23.5.2012 Životní cyklus aktivity zdroj: http://developer.android.com/guide/topics/fundamentals/activities.html Java, letní semestr 2012 23.5.2012 Fragments ● od Android 3.0 – ● ● ● existuje „support package“, která přidává podporu i pro starší verze znovupoužitelná část uživatelského rozhraní aktivita může zobrazovat několik fragmentů snadná tvorba UI pro různé typy displayů – – telefon tablet Java, letní semestr 2012 23.5.2012 Intents ● komponenty aplikace (aktivity, služby a broadcast receivery) jsou aktivovány pomocí Intentů – – „zprávy“ Intent – pasivní objekt ● ● potomek android.content.Intent položky – – component name action ● – data ● – řetězec ● mnoho předdefinovaných ● lze vytvořit vlastní URI dat, se kterými se má pracovat category ● další informace o typu komponenty, která má na intent reagovat – extras – flags Java, letní semestr 2012 23.5.2012 Intents ● explicitní – – ● implicitní – – ● se jménem cílové komponent typicky používané uvnitř aplikace bez jména komponenty typicky komunikace mezi aplikacemi intent filtry – – které intenty komponenta může obsloužit zapisuje se v manifestu <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> Java, letní semestr 2012 23.5.2012 Intents ● lze nastavit oprávnění reagování na intent – – ● zapsáno v manifestu schvalováno v okamžiku instalace i „systémové“ aplikace reagují na intenty – > lze si napsat vlastní „systémové“ aplikace ● Mailer, SMS app, Homepage,... Java, letní semestr 2012 23.5.2012 Intents – příklad private static final int ACTIVITY_PICK_CONTACT = 42; private void pickContact() { Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(intent, ACTIVITY_PICK_CONTACT); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case (ACTIVITY_PICK_CONTACT) : if (resultCode == Activity.RESULT_OK) { Uri pickedContact = data.getData(); return; } break; } } Java, letní semestr 2012 23.5.2012 Task ● zásobník spuštěných aktivit – ● ● ● aktivita reaguje na intent = vytvoří se nová instance a vloží se na zásobník uživatel komunikuje s aktivitou na vrcholu může existovat více tasků paralelně task ~ běžící aplikace Java, letní semestr 2012 23.5.2012 Services ● ● služby běžící na pozadí potomci od android.app.Service – ● nestartují automaticky svoje vlákno! IntentService – – – – potomek od Service určeno pro služby reagující na intenty již obsahuje správu vláken stačí předefinovat void onHandleIntent(Intent intent) Java, letní semestr 2012 23.5.2012 Vlákna ● ● aktivity aplikace se spouští v jednom vlákně události se také obsluhují v tomto vlákně – „main“ thread / UI thread ● obdobně jako Swing ● UI není „thread-safe“ – – ● pomocné metody – – – ● manipulace s UI provádět v „main“ vláknu neblokovat „main“ vlákno Activity.runOnUiThread(Runnable) View.post(Runnable) View.postDelayed(Runnable, long) AsyncTask – obdoba SwingWorkeru Java, letní semestr 2012 23.5.2012 Dialogy voláno pouze jednou @Override protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_SHOW_CONTACT: { return new AlertDialog.Builder(this).setTitle("XXX"). setMessage("Message").setCancelable(true). setPositiveButton("OK", null).create(); } } “uživatelská” return null; konstanta } voláno před každým zobrazením @Override protected void onPrepareDialog(int id, Dialog dialog) { switch (id) { case DIALOG_SHOW_CONTACT: { if (pickedContact != null) { ((AlertDialog) dialog).setMessage("YYY")); } }}} Java, letní semestr 2012 23.5.2012 Dialogy ● showDialog(DIALOG_SHOW_CONTACT); – zobrazení dialogu Java, letní semestr 2012 23.5.2012 JAVA Real-Time Java Java, letní semestr 2012 23.5.2012 Real-time systém ● česky někdy jako „systém reálného času“ ● ne-real-time systém – ● systém funguje správně pokud dává správné výsledky real-time systém – systém funguje správně pokud dává správné výsledky v požadovaném čase Java, letní semestr 2012 23.5.2012 Real-time systém ● příklad – lékařské zařízení musí detekovat změny v pacientově stavu a včas reagovat zdroj obrázku Issovic, D.:Real-time systems, basic course Java, letní semestr 2012 23.5.2012 Real-time systém ● jinak... zdroj obrázku Issovic, D.:Real-time systems, basic course Java, letní semestr 2012 23.5.2012 Real-time systém ● příklad – airbag se nesmí nafouknout ani příliš brzo ani příliš pozdě real-time ≠ rychle zdroj obrázku Issovic, D.:Real-time systems, basic course Java, letní semestr 2012 23.5.2012 Real-time sytém ● ● ● soft real-time hard real-time safety-critical Java, letní semestr 2012 23.5.2012 Java a RT ● Java – – – – ● jednoduchá široce používaná množství knihoven portabilní ale – – – – – – – není real-time plánování není podpora pro periodické vykonávání není podpora pro aperiodické události problémy s GC problémy s přímým přístupem do paměti problémy s ovládáním zařízení ... Java, letní semestr 2012 23.5.2012 Garbage collector Java, letní semestr 2012 23.5.2012 Real-time Specification for Java ● ● ● ● ● RTSJ 1999 – JSR-1 nyní ve verzi 1.0.2 žádné změny v syntaxi rozšíření Javy o – – – – – – – Thread Scheduling and Dispatching Memory Management Synchronization and Resource Sharing Asynchronous Event Handling Asynchronous Transfer of Control and Asynchronous Thread Termination High resolution time Physical and Raw Memory Access Java, letní semestr 2012 23.5.2012 RTSJ – plánování ● Fixed-priority round robin plánovač – lze přidat vlastní ● Minimálně 28 real-time priorit navíc k 10 základním ● Periodická vlákna – – ● mohou začít v určeném čase mají periodu a deadline Aperiodické události – plánovatelný objekt, která je vykonán jako reakce na událost Java, letní semestr 2012 23.5.2012 RTSJ – paměť ● NoHeapRealtimeThread – – ● halda – ● jako normálně immortal paměť – – ● vlákno bez přístupu k haldě nemůže být blokováno GC nelze z ní objekty uvolňovat pro globální data scoped paměť – – – regiony paměti objekty uvolněny naráz pokud všechna vlákna opustí region vhodné pro volání metod z std knihovny Java, letní semestr 2012 23.5.2012 RTSJ – paměť ● pravidla pro reference mezi objekty Immortal Memory Java, letní semestr 2012 23.5.2012 Heap Memory RTSJ ● problémy – – – ● paměťové regiony jsou neintuitivní změny v klasickém programovacím modelu s GC přiřazení reference může selhat existují real-time garbage collectory Java, letní semestr 2012 23.5.2012 Ravenscar Java ● ● ● omezení RTJS inspirováno „Ravenscar for Ada“ cíl – ● lepší analyzovatelnost a predikovatelnost příklad omezení – žádný GC Java, letní semestr 2012 23.5.2012 JAVA LeJOS Java, letní semestr 2012 23.5.2012 Přehled ● ● ● http://lejos.sourceforge.net/ firmware pro LEGO Mindstorm obsahuje Java virtual machine tj. LEGO roboty lze programovat v Javě Java, letní semestr 2012 23.5.2012 Příklad public static void main(String[] argv) { TouchSensor touchL = new TouchSensor(SensorPort.S4); TouchSensor touchR = new TouchSensor(SensorPort.S1); UltrasonicSensor sonar = new UltrasonicSensor(SensorPort.S2); Motor.A.forward(); Motor.C.forward(); LCD.drawString("Press ESC to quit", 0, 0); while (true) { if (Button.ESCAPE.isPressed()) { System.exit(0); } if (touchL.isPressed() || touchR.isPressed() || (sonar.getDistance() < 40)) { Motor.A.stop(); Motor.C.stop(); sleep(1000); Motor.A.backward(); Motor.C.backward(); sleep(1000); Motor.A.forward(); Motor.C.backward(); sleep(1000); Motor.A.stop(); Motor.C.stop(); sleep(1000); Motor.A.forward(); Motor.C.forward(); } } } Java, letní semestr 2012 23.5.2012 LeJOS ● ● ● Java 7 mix Java SE a ME omezení – nejsou classloadery – po kompilaci se vytvoří binární obraz aplikace ● ● ● nahraje se do „kostky“ nxjlink -v ClassWithMain -o App.nxj nxjupload App.nxj Java, letní semestr 2012 23.5.2012 LeJosRT ● ● ● ● http://lejosrt.org/ real-time LeJOS „fork“ z LeJOS LeJOS plus RTSJ – není kompletní implementace RTSJ Java, letní semestr 2012 23.5.2012 JAVA Maven Java, letní semestr 2012 23.5.2012 Přehled ● ● http://maven.apache.org/ nástroj pro správu projektů – „zjednodušeně“ si lze představit jako rozšíření Antu ● ● ale není to rozšíření Antu poskytuje – – – – – správu závislostí usnadnění „překládání“ (build) projektů používání „best practices“ přidávání nových modulů … Java, letní semestr 2012 23.5.2012 Používání ● vygenerování struktury projektu mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.mycompany.app -DartifactId=my-app – archetype ~ šablona projektu – vygeneruje následující strukturu Java, letní semestr 2012 23.5.2012 Struktura projektu my-app |-- pom.xml `-- src |-- main | `-- java | `-- com | `-- mycompany | `-- app | `-- App.java `-- test `-- java `-- com `-- mycompany `-- app `-- AppTest.java Java, letní semestr 2012 23.5.2012 POM – Project Object Model ● „definice“ projektu <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>Maven Quick Start Archetype</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project> Java, letní semestr 2012 23.5.2012 Životní cyklus „buildu“ ● mvn „fáze“ – vždy se provedou i předchozí fáze 1. process-resources 2. compile 3. process-test-resources 4. test-compile 5. test 6. package 7. install 8. deploy Java, letní semestr 2012 23.5.2012 Další ● generování jiných typů projektů mvn archetype:generate \ -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.mycompany.app -DartifactId=my-webapp ● generování dokumentace mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-site -DgroupId=com.mycompany.app -DartifactId=my-app-site Java, letní semestr 2012 23.5.2012 JAVA Apache Ivy Java, letní semestr 2012 23.5.2012 Přehled ● ● ● http://ant.apache.org/ivy správa závislostí rozšíření pro Ant – ● lze použít i samostatně „lightweight“ maven Java, letní semestr 2012 23.5.2012 Použití ● závislosti v souboru ivy.xml <ivy-module version="2.0"> <info organisation="org.apache" module="hello-ivy"/> <dependencies> <dependency org="commons-lang" name="commons-lang" rev="2.0"/> <dependency org="commons-cli" name="commons-cli" rev="1.0"/> </dependencies> </ivy-module> ● build.xml <project xmlns:ivy="antlib:org.apache.ivy.ant" name="hello-ivy" default="run"> <target name="resolve" description="retrieve dependencies with ivy"> <ivy:retrieve /> </target> </project> Java, letní semestr 2012 23.5.2012 Závislosti ● ● implicitně se používají maven repozitáře lze definovat vlastní – – – local shared public Java, letní semestr 2012 23.5.2012
Podobné dokumenty
Google Android
c:\users\jmeno\.android\ debug.keystore
znovu se vytvoří
více info ohledně certifikace aplikací viz
http://developer.android.com/guide/publishing/app-signing.html
heppers
jazyka, které nejsou primárně určeny pro běh programů v reálném čase.
2. SPRÁVA PAMĚTI V RÁMCI SPECIFIKACE RTSJ
Jedním z klíčových problémů řešených v rámci specifikace RTSJ je správa programové
ha...
Pokrocile programovani na platforme Java, letní semestr 2011
nejmenší konfigurace
pro malá zařízení s omezenými zdroji
požadavky na HW
Kognitivní stimulace pacientů trpících Alzheimerovou chorobou
snížení poklesu kognitivních funkcí, zejména u osob s mírnou kognitivní poruchou. Aplikace
obsahuje celkem šest kognitivních her. Jedná se o N-back test, hry s čísly a písmeny. Hru
s větami, která ...
Rozpoznavani zavislosti ve vagnich datech
reprezentovaly objekty, sloupce odpovídaly analyzovaným atributům. Vztah mezi
objekty a atributy byl tedy čistě bivalentní, buď objekt atribut měl nebo ne. To
je samozřejmě značné omezení, protože ...
Řízení robota MINDSTORMS NXT pomocí PC PC Controlling of
ovládacích prvků na kostce. SW můžeme vytvořit programy různých složitostí, tímto
programovacím prostředím se v této práci však zabývat nebudeme.
Jak je vidět na obrázku Obr. 5 robot kromě firmwaru...