Pokrocile programovani na platforme Java, letní semestr 2012

Transkript

Pokrocile programovani na platforme Java, letní semestr 2012
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

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

Více

heppers

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...

Více

Pokrocile programovani na platforme Java, letní semestr 2011

Pokrocile programovani na platforme Java, letní semestr 2011 nejmenší konfigurace pro malá zařízení s omezenými zdroji požadavky na HW

Více

Kognitivní stimulace pacientů trpících Alzheimerovou chorobou

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á ...

Více

Rozpoznavani zavislosti ve vagnich datech

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 ...

Více

Řízení robota MINDSTORMS NXT pomocí PC PC Controlling of

Ří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...

Více