You are on page 1of 38

Preddiplomski studij Diplomski studij

Razvoj usluga i aplikacija za operacijski sustav Android


6. Elementi grafikog suelja u Androidu (nastavak) Koritenje specifinog sklopovlja u Androidu
Ak.g. 2012./2013.
Zatieno licencom http://creativecommons.org/licenses/by-nc-sa/2.5/hr/
14. 11. 2012.

Creative Commons
slobodno smijete:

dijeliti umnoavati, distribuirati i javnosti priopavati djelo remiksirati preraivati djelo

pod sljedeim uvjetima:


imenovanje. Morate priznati i oznaiti autorstvo djela na nain kako je specificirao autor ili davatelj licence (ali ne nain koji bi sugerirao da Vi ili Vae koritenje njegova djela imate njegovu izravnu podrku). nekomercijalno. Ovo djelo ne smijete koristiti u komercijalne svrhe. dijeli pod istim uvjetima. Ako ovo djelo izmijenite, preoblikujete ili stvarate koristei ga, preradu moete distribuirati samo pod licencom koja je ista ili slina ovoj.

U sluaju daljnjeg koritenja ili distribuiranja morate drugima jasno dati do znanja licencne uvjete ovog djela. Najbolji nain da to uinite je linkom na ovu internetsku stranicu. Od svakog od gornjih uvjeta mogue je odstupiti, ako dobijete doputenje nositelja autorskog prava. Nita u ovoj licenci ne naruava ili ograniava autorova moralna prava.
Tekst licencije preuzet je s http://creativecommons.org/.
14. 11. 2012.

Sadraj predavanja
Uvod i ponavljanje prethodnog predavanja Elementi grafikog suelja u Androidu

Objavljivanje, primanje i pretplaivanje na namjere Dodatni tipovi namjera Filtriranje i usporedba namjera s filtrima Fragmenti (Fragments)

Koritenje specifinog sklopovlja u Androidu


Senzori Lokacijske usluge (GPS)

14. 11. 2012.

Ponavljanje
Na prethodnom predavanju smo pokazali kako (eksplicitno i implicitno) putem namjere (Intent) moemo pozvati jednu aktivnost (Activity) iz druge Dijelovi namjere

Primjeri na Android Developers

Komponenta (Component) eksplicitno se specificira komponenta koja obrauje namjeru, umjesto implicitnog zakljuivanja na osnovu akcije, kategorije i (tipa) podataka Akcija (Action) String koji oznaava akciju koja se eli napraviti ili se dogodila pa se obavjetava o njoj Kategorija (Category) dodatne informacije o vrsti komponente koja obrauje ovu namjeru Podaci (Data) glavni podaci u obliku URI-ja Tip (Type) tip podataka u obliku MIME-a Dodaci (Extras) pomoni podaci koji se nadodaju namjeri
14. 11. 2012.

Razmjena poruka namjerama


Na prethodnom predavanju smo pokazali kako putem namjera mogu razmjenjivati podaci izmeu aktivnosti Putem namjera se takoer mogu razmjenjivati anonimne poruke izmeu aplikacija na ureaju

Objavljivai namjera (Intent Broadcasters)

Putem namjera razailju se dogaaji koji su potencijalno zanimljivi drugim aplikacijama Primaju dogaaje (tj. namjere) od interesa i reagiraju na njih Moraju se pretplatiti (tj. registrirati) za primanje dogaaja od interesa Dogaaji od interesa se definiraju s filtrom namjera (Intent Filter)

Primatelji namjera (Broadcast Receivers)


14. 11. 2012.

Sadraj predavanja
Uvod i ponavljanje prethodnog predavanja Elementi grafikog suelja u Androidu

Objavljivanje, primanje i pretplaivanje na namjere Dodatni tipovi namjera Filtriranje i usporedba namjera s filtrima Fragmenti (Fragments)

Koritenje specifinog sklopovlja u Androidu


Senzori Lokacijske usluge (GPS)

14. 11. 2012.

Primjer objavljivanja i primanja namjere

Objavljivanje

static final String SPECIAL_EVENT = "hr.fer.tel.ruazosa.events.SPECIAL"; Intent intent = new Intent(SPECIAL_EVENT); sendBroadcast(intent);

Primanje namjere

public class SpecialBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //TODO Process intent } }

14. 11. 2012.

O primanju objavljene namjere


Samo oni objavljivai koji su izrazili interes (tj. pretplatili se, registrirali) e primiti objavljenu namjeru Pri primanju objavljene namjere, pokrenut e se metoda onReceive primatelja Metoda onReceive se mora zavriti u 5 sekundi

Glavno procesiranje se ne smije izvravati u ovoj metodi Ova metoda obavlja samo pomono procesiranje

Auriranje podataka Pokretanje servisa Prilagoavanje GUI-ja

14. 11. 2012.

Primjer primanja objavljene namjere


public class SpecialReceiver extends BroadcastReceiver { public static final String SPECIAL_EVENT = "hr.fer.tel.ruazosa.predavanje6.SPECIAL_EVENT";

@Override public void onReceive(Context context, Intent intent) { Intent newIntent = new Intent(context, ReceiverActivity.class); newIntent.putExtra("message", "Receiving special event: " + new Date().toString()); newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(newIntent); } }
14. 11. 2012.

Pretplaivanje na objavljene namjere

Postoje dvije vrste pretplaivanja na objavljene namjere


Pretplaivanje u kodu

Objavljene namjere e biti primljene samo u sluaju kada se izvodi komponenta koja se pretplatila Inae, ova komponenta ne moe primiti objavljene namjere Ovo pretplaivanje se najee koristi kada se eli aurirati prikaz GUI-ja prilikom primanje namjere od interesa Treba se pretplatiti unutar metode onResume, a otkazati pretplatu (radi utede resursa) u metodi onPause Ovako definiran pretplatnik je uvijek aktivan Prima objavljene namjere i kada aplikacija nije pokrenuta

Pretplaivanje u manifestu

14. 11. 2012.

Primjer pretplaivanja u kodu


public class ReceiverActivity extends Activity { private IntentFilter filter = new IntentFilter(SpecialReceiver.SPECIAL_EVENT); private BroadcastReceiver receiver = new SpecialReceiver(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_receiver); Bundle extras = getIntent().getExtras(); if (extras != null) { String message = extras.getString("message"); LinearLayout layout = (LinearLayout) findViewById(R.id.LinearLayout); TextView lastReceive = new TextView(this); lastReceive.setText(message); layout.addView(lastReceive); } } @Override public void onResume() { super.onResume(); registerReceiver(receiver, filter); } }
14. 11. 2012.

Primjer pretplaivanja u manifestu


<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".ReceiverActivity" android:label="@string/title_activity_special_receiver" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".SpecialReceiver" > <intent-filter> <action android:name="hr.fer.tel.ruazosa.predavanje6.SPECIAL_EVENT" /> </intent-filter> </receiver> </application>
14. 11. 2012.

Sadraj predavanja
Uvod i ponavljanje prethodnog predavanja Elementi grafikog suelja u Androidu

Objavljivanje, primanje i pretplaivanje na namjere Dodatni tipovi namjera Filtriranje i usporedba namjera s filtrima Fragmenti (Fragments)

Koritenje specifinog sklopovlja u Androidu


Senzori Lokacijske usluge (GPS)

14. 11. 2012.

Objavljivanje ureenih namjera


Ponekad je namjere potrebno isporuiti primateljima tono odreenim redoslijedom To se radi definiranjem prioriteta primatelja (vee je bolje) Primjer definiranja prioriteta primatelja

<receiver android:name=".SpecialReceiver" > <intent-filter android:priority=100> <action android:name="hr.fer.tel.ruazosa.predavanje6.SP ECIAL_EVENT" /> </intent-filter> </receiver>

Primjer objavljivanja ureene namjere


14. 11. 2012.

sendOrderedBroadcast(intent, null);

Ljepljive namjere (Sticky Intents)


Kod ove vrste namjera, uvijek se pamti zadnje objavljena Novi pretplatnici ne moraju ekati prvu sljedeu objavu Primjer objavljivanja i uklanjanja objave ljepljive namjere

sendStickyBroadcast(intent); removeStickyBroadcast(intent);

Ljepljive namjere se esto dohvaaju jednokratnim upitima, bez definiranja primatelja

IntentFilter battery = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent currentBatteryCharge = registerReceiver(null, battery);


14. 11. 2012.

Sadraj predavanja
Uvod i ponavljanje prethodnog predavanja Elementi grafikog suelja u Androidu

Objavljivanje, primanje i pretplaivanje na namjere Dodatni tipovi namjera Filtriranje i usporedba namjera s filtrima Fragmenti (Fragments)

Koritenje specifinog sklopovlja u Androidu


Senzori Lokacijske usluge (GPS)

14. 11. 2012.

Lokalno objavljivanje namjera

Razmjena namjera unutar aplikacije se postie pomou lokalnog upravitelja objava

LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);

Primjer lokalnog objavljivanja namjere

lbm.sendBroadcast(new Intent(LOCAL_ACTION));

Primjer lokalnog definiranja pretplate

lbm.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) {//TODO Process intent} }, new IntentFilter(LOCAL_ACTION));
14. 11. 2012.

Usporedba namjera i njihovih filtara


Otkriva se kojim aplikacijama je koja namjera od interesa Procedura usporedbe:

1. Stvori listu filtara svih aplikacija i usluga na ureaju 2. Ukoliko kategorija ili akcija filtra ne odgovara namjeri, makni ga iz liste 3. Usporedi svaki dio podatka (URI-ja i tipa) namjere s filtrom i makni filtar iz liste ako nae bilo koju razliku 4. a) Ako namjera implicitno pokree aktivnost, korisniku ponudi izbor svih onih koje zadovoljavaju namjeru b) Ako je namjera objavljena, isporui je svim pretplatnicima iji filtri je zadovoljavaju, pri tome uzmi u obzir prioritet primatelja

14. 11. 2012.

Zadnje napomene vezana uz namjere

Sve aktivnosti koje ele primati implicitne namjere moraju imati definiranu sljedeu kategoriju u svom filtru namjera:

android.intent.category.DEFAULT

Od ovog pravila su izuzete aktivnosti koje definiraju

akciju MAIN glavna ulazna toka aplikacije i kategoriju LAUNCHER prikaz na zaslonu aplikacija koje se mogu pokrenuti na ureaju android.intent.action.MAIN android.intent.category.LAUNCHER

14. 11. 2012.

Sadraj predavanja
Uvod i ponavljanje prethodnog predavanja Elementi grafikog suelja u Androidu

Objavljivanje, primanje i pretplaivanje na namjere Dodatni tipovi namjera Filtriranje i usporedba namjera s filtrima Fragmenti (Fragments)

Koritenje specifinog sklopovlja u Androidu


Senzori Lokacijske usluge (GPS)

14. 11. 2012.

Fragmenti
Ideja je da se aktivnost (tj. njen prikaz) se dijeli na manje komponente fragmente Glavne karakteristike fragmenata

Enkapsuliraju dijelove korisnikog suelja Mogu se jednostavno ponovno koristiti Svaki ima svoj vlastiti ivotni ciklus Dinamiki se mogu dodavati i uklanjati Suelje se lake prilagoava ureaju Za razliku od aktivnosti ne trebaju se registrirati u manifestu

14. 11. 2012.

Primjer koritenja fragmenata

14. 11. 2012.

Usporedba ivotnog ciklusa aktivnosti i fragmenta

14. 11. 2012.

Primjer dodavanja fragmenta u aktivnost XML-om


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <fragment android:name="android.support.v4.app.ListFragment" android:layout_width="match_parent" android:layout_height="wrap_content" tools:layout="@layout/fragment_receiver" /> </LinearLayout>

Koristi se za statiki prikaz i prilagodbu razliitim veliinama zaslona Android ureaja


14. 11. 2012.

Primjer programskog dodavanja fragmenta u aktivnost


public class MyFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // If this Fragment has no UI then return null. return inflater.inflate(R.layout.my_fragment, container, false); } }

Ovo se naziva dinamiko dodavanje, obavlja se transakcijski

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.add(R.id.myfragment_container, new MyFragment(), getString(R.string.myfragment_tag)); fragmentTransaction.commit();

Dinamiki fragment je potrebno dodati u postojei ViewGroup unutar aktivnosti


14. 11. 2012.

Dinamika zamjena i uklanjanje fragmenata

Zamjena i uklanjanje se takoer vri transakcijski:

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); //zamjena fragmentTransaction.replace(R.id.myfragment_container, new MyFragment()); //uklanjanje Fragment myfragment = fragmentManager.findFragmentById(R.id.myfragment_container); fragmentTransaction.remove(myfragment); fragmentTransaction.commit();

Force-anje commit-a Pronalaenje fragmenta


14. 11. 2012.

fragmentManager.executePendingTransactions();
findFragmentById(R.id.myfragment_container) findFragmentByTag(getString(R.string.myfragment_tag))

Dohvaanje aktivnosti u kojoj se nalazi fragment

Vrlo korisna opcija


Dohvaanje trenutnog Context-a, Pristup ostalim fragmentima iste aktivnosti Pristup ostalim elementima prikaza aktivnosti

Primjer dohvaanja gumba Fragmenti ne bi trebali komunicirati direktno, ve bi aktivnost trebala biti posrednik u komunikaciji
Odrava se slaba meusobna povezanost fragmenata

Button button = (Button) myfragment.getActivity().findViewById(R.id.button);

Ukoliko fragment treba o neemu obavijestiti aktivnost, preporuka je da aktivnost implementira odgovarajue suelje koje e fragment pozvati po potrebi
14. 11. 2012.

Sadraj predavanja
Uvod i ponavljanje prethodnog predavanja Elementi grafikog suelja u Androidu

Objavljivanje, primanje i pretplaivanje na namjere Dodatni tipovi namjera Filtriranje i usporedba namjera s filtrima Fragmenti (Fragments)

Koritenje specifinog sklopovlja u Androidu


Senzori Lokacijske usluge (GPS)

14. 11. 2012.

Podrani senzori u Androidu


Sensor TYPE_ACCELEROMETER TYPE_AMBIENT_TEMPERATURE TYPE_GRAVITY TYPE_GYROSCOPE TYPE_LIGHT TYPE_LINEAR_ACCELERATION TYPE_MAGNETIC_FIELD TYPE_ORIENTATION TYPE_PRESSURE TYPE_PROXIMITY TYPE_RELATIVE_HUMIDITY TYPE_ROTATION_VECTOR TYPE_TEMPERATURE Type HW HW SW or HW HW HW SW or HW HW SW HW HW HW SW or HW HW Common Uses Motion detection (shake, tilt, etc.). Monitoring air temperatures. Motion detection (shake, tilt, etc.). Rotation detection (spin, turn, etc.). Controlling screen brightness. Monitoring acceleration along a single axis. Creating a compass. Determining device position. Monitoring air pressure changes. Phone position during a call. Monitoring dewpoint, absolute, and relative humidity. Motion detection and rotation detection. Monitoring temperatures.

14. 11. 2012.

Simuliranje senzora u Android SDK-u

Dohvatiti arhivu sensorsimulator-2.0-rc1.zip sa sljedeeg linka:

http://code.google.com/p/openintents/downloads/lis t?q=sensorsimulator Raspakirati arhivu sensorsimulator-2.0-rc1.zip Pokrenuti desktop aplikaciju sensorsimulator-2.0-rc1 \bin\sensorsimulator-2.0-rc1.jar Kopirati sensorsimulator-2.0-rc1 \bin\ SensorSimulatorSettings-2.0-rc1.apk u androidsdk\tools Instalirati apk preko konzole: android-sdk\tools> ..\platform-tools\adb.exe install SensorSimulatorSettings-2.0-rc1.apk

Pokrenuti SensorSimulatorSettings na ureaju Prepisati IP adresu i port iz desktop aplikacije U aplikaciji na ureaju kliknuti Connect u tabu Testing
14. 11. 2012.

Pristup simuliranim senzorima iz koda


Kopirati sensorsimulator-2.0-rc1\lib\sensorsimulator-lib2.0-rc1.jar u mapu libs Eclipse projekta Dodati ovu datoteku u Java Build Path projekta Dodati dozvolu u manifest Primjer izlistavanja svih dostupnih senzora

<uses-permission android:name="android.permission.INTERNET"/>

String service_name = Context.SENSOR_SERVICE; SensorManagerSimulator sensorManager = SensorManagerSimulator.getSystemService(ListSensorsActivity.this , service_name); sensorManager.connectSimulator(); List<Integer> allSensors = sensorManager.getSensors(); //list all available sensors LinearLayout layout = (LinearLayout) findViewById(R.id.linear_layout_list); for(int i = 0; i < allSensors.size(); i++) { //Sensor sensor = sensorManager.getDefaultSensor(allSensors.get(i)); TextView textView = new TextView(ListSensorsActivity.this); textView.setText((i+1) + ". " + SensorNames.getSensorName(allSensors.get(i))); layout.addView(textView); }
14. 11. 2012.

Pristup stvarnim senzorima iz koda


Slino, ali ipak razliito Mora se paziti na razlike! Primjer izlistavanja dostupnih senzora

String service_name = Context.SENSOR_SERVICE; SensorManager sensorManager = (SensorManager)getSystemService(service_name); List<Sensor> allSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);

LinearLayout layout = (LinearLayout) findViewById(R.id.linear_layout_list); for(int i = 0; i < allSensors.size(); i++) { Sensor sensor = allSensors.get(i); TextView textView = new TextView(ListSensorsActivity.this); textView.setText(i + 1 + ". " + sensor.getName()); layout.addView(textView); }

14. 11. 2012.

Definiranje sluaa senzorskih dogaaja

Kao i kod dogaaja koji su vezani uz korisnike akcije na suelju, potrebno je definirati sluaa senzorskih dogaaja

public class AccelerometerListener implements SensorEventListener { public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub }

public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub }


}

Jedna metoda prati promjene senzora, a druga promjene u tonosti njegova oitanja
14. 11. 2012.

Registriranje i deregistracija sluaa senz. dogaaja

Slua dogaaja kao privatni atribut

private SensorEventListener accelerometerListener = new AccelerometerListener();

Registracija sluaa senz. dogaaja u metodi onCreate

Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); sensorManager.registerListener(accelerometerListener, accelerometer, SensorManagerSimulator.SENSOR_DELAY_NORMAL);

Deregistracija sluaa senz. dogaaja u metodi finish

String service_name = Context.SENSOR_SERVICE; SensorManagerSimulator sensorManager = SensorManagerSimulator.getSystemService(this, service_name); sensorManager.connectSimulator(); sensorManager.unregisterListener(accelerometerListener);


14. 11. 2012.

Sadraj predavanja
Uvod i ponavljanje prethodnog predavanja Elementi grafikog suelja u Androidu

Objavljivanje, primanje i pretplaivanje na namjere Dodatni tipovi namjera Filtriranje i usporedba namjera s filtrima Fragmenti (Fragments)

Koritenje specifinog sklopovlja u Androidu


Senzori Lokacijske usluge (GPS)

14. 11. 2012.

Definiranje sluaa lokacijskih dogaaja

Kao i kod senzora potrebno je definirati sluaa dogaaja vezanih uz promjenu lokacije

private class GPSListener implements LocationListener {

public void onLocationChanged(Location location) { updateWithNewLocation(location); } public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } }
14. 11. 2012.

Registriranje i deregistracija sluaa lok. dogaaja


Slua dogaaja kao privatni atribut Registracija sluaa lok. dogaaja u metodi onCreate

private LocationListener gpsListener = new GPSListener();


String provider = Context.LOCATION_SERVICE; LocationManager locationManager = (LocationManager) getSystemService(provider); locationManager.requestLocationUpdates(LocationManager.GPS_PROVI DER, 0, 0, gpsListener); Location location = locationManager.getLastKnownLocation(provider);

Deregistracija sluaa lok. dogaaja u metodi finish

String provider = Context.LOCATION_SERVICE; LocationManager locationManager = (LocationManager) getSystemService(provider); locationManager.requestLocationUpdates(LocationManager.GPS_PROVI DER, 0, 0, gpsListener); locationManager.removeUpdates(gpsListener);
14. 11. 2012.

Zavrne napomene vezane

Dodati dozvolu u manifest

<uses-permission android:name=android.permission.ACCESS_FINE_LOCATION/>

Simuliranje promjene lokacije u emulatoru


Telnetirati se na port emulatora:
telnet localhost 5554

Mijenjati lokaciju sljedeom naredbom:


geo fix <longitude value> <latitude value>

14. 11. 2012.

You might also like