Mobilszoftverek - ZH-kidolgozás
A VIK Wikiből
(MobilszoftverekZH1Kidolgozas szócikkből átirányítva)
Ez az oldal a korábbi SCH wikiről lett áthozva.
Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!
Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.
Symbian
Elnevezési konvenciók
- Osztályok
- T,C,M,R betűkkel kezdődnek
- Változók
- a: argumentum
- i: tagváltozó
- Kisbetűvel kezdődik: lokális változó
- Nagybetűvel kezdődik: globális
Kivétel-, és memóriakezelés
- Kivétel dobása: User::Leave()
- Elkapása: TRAP, TRAPD
- Kivételt dobó memóriafoglalás: new (ELeave)
- Ha dobhat kivételt, akkor a metódus neve L-re végződik
- Példa:
TRAPD( hiba, ProbaL() ); if ( hiba != KErrNone )
- CleanupStack: Olyan tároló, ami kivétel esetén felszabadítja a rá tett mutatókat
- C osztályokra
- CleanupStack::PushL
- CleanupStack::PopAndDestroy
- R osztályokra
- CleanupClosePushL
- CleanupReleasePushL
- CleanupDeletePushL
- Létrehozása: CTrapCleanup* cleanup = 4CTrapCleanup::New();
- Példa:
- C osztályokra
TInt* szam = new (ELeave) TInt; CleanupStack::PushL(szam); UtasitasAmiLeavelhetL(); // leavelhet! // szam-ot levesszük és rögtön töröljük is CleanupStack::PopAndDestroy();
- Kétfázisú konstrukció
- Probléma: Ha egy konstruktorban létrehozunk más objektumokat is, amik foglalnak le memóriát, de végülis leave-el, akkor nem lesz felszabadítva
- Megoldás: Első fázisban nem leavelhet a konstruktor, másodikban igen
- Azonban mivel így lehet olyan, hogy inkonzisztens állapotban van az objektum, ezért szükséges egy statikus factory fv, ami meghívj mindkettőt
- Példa:
void CKulsoOsztaly::ConstructL() { //ebbıl már nem lesz probléma iTagValtozo = new(ELeave) CBelsoOsztaly(); } CKulsoOsztaly * CKulsoOsztaly::NewLC() { //konstruktor, egyszerő inicializálások CKulsoOsztaly * self = new (ELeave) CKulsoOsztaly(); CleanupStack::PushL(self); self->ConstructL(); /*veszélyes inicializálások, de ekkorra az objektum már a CleanupStack-en van*/ return self; } CKulsoOsztaly * CKulsoOsztaly::NewL() { CKulsoOsztaly * self = NewLC(); CleanupStack::Pop(); return self; }
Aszinkron eseménykezelés (Active Object)
- OS kezeli a szálakat
- Lehet indítani valamilyen háttérműveletet, és a befejeződéséről kapunk eseményt
- CActive-ból származik az eseménykezelő osztályunk
- DoCancel()
- RunL()
- RunError(TInt aError)
- !A konstruktorában kötelező felrakni az ütemezőre CActiveScheduler::Add()-al
- Példa:
iMyTimer.Start(10000000, iStatus); SetActive();
- IStatus: Az objektum állapota, ha KErrNone, akkor nincs hiba
- Cancel(): Megszakítja a működését
- Destruktorba kötelező meghívni a Cancel()-t
- ActiveScheduler létrehozása:
CActiveScheduler sheduler = new (ELeave) CActiveScheduler; CActiveScheduler::Install(scheduler); CActiveScheduler::Start();
Qt
QT alapok
- .pro fájl: projektleíró, a projekt adatait tartalmazza (library-k, elérési utak, források)
- QObject: Minden Qt objektum őse
- Csak referencia szerint adódnak át
- Hierarhiába vannak rendezve => Composite pattern
- Ha a szülő meghal, halnak a gyerekei is
- Signals and slots: Eseménykezelésre
- Signal: egy eseményforrás
- Slot: egy eseményfeldolgozó
- Összekapcsolható a Signal a Slottal
- Tulajdonságai
- Típusbiztos: Signal és Slot szignatúrája megegyezik
- (*,*) kardinalitású
- Objektumoknak QObjectből kell származniuk
- Példa:
//deklarálás public slots: void setValue(int value); signals: void valueChanged(int newValue); //Signal kibocsátása emit valueChanged(value); //Összekapcsolás: QObject::connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));
- QMetaObject: Másik objektum szerkezetét írja le (~reflection)
- className()
- superClass()
- methodCount()
- property()
- Propertyk: Getter/Setter, de azon túlmutat
- QVariant
- Név alapján elérhetők
- Példa:
Q_OBJECT Q_PROPERTY(Priority priority READ priority WRITE setPriority) Q_ENUMS(Priority) ... object->setProperty("priority", "VeryHigh");
- Priority: Enum, pritority: getter, setPriority: setter
- Meta Object Compiler (MOC): Előfordító
- Ha QOBJECT direktívát talál egy forrásban, akkor abból C++ kódot generál
Gt GUI
- QWidget: Minden megjelenő elem őse
- Téglalap alakú, Z-index szerint látszik
- Eseményeket kezel
- Composite
- Layout
- QMainWindow: Központi Widget, és menüsort, status bart, toolbarokat
- QDialog: Különálló dialógusablak
- Minden eseménytípushoz egy eseménykezelő metódus:
- paintEvent()
- mousePressEvent()
- keyPressEvent()
- stb...
- QPainter: Rajzoláshoz
- repaint(): Azonnal hív paint-et
- update(): Beütemezi a paint-et
- Példa:
QPainter qpainter(this); qpainter.drawRect(rect());
- Layoutok:
- QHBoxLayout
- QVBoxLayout
- QGridLayout
- QFormLayout
- QStackedLayout
- Méretek állíthatóak hintekkel
- Példa:
//Beállítás: QWidget::setLayout(); QWidget *window = new QWidget; QPushButton button1 = new QPushButton("One"); QPushButton *button2 = new QPushButton("Two"); QPushButton *button3 = new QPushButton("Three"); QGridLayout *layout = new QGridLayout; layout->addWidget(button1, 0, 0); layout->addWidget(button2, 0, 1); layout->addWidget(button3, 1, 0, 1, 2); window->setLayout(layout); window->show();
- Lokalizáció:
- tr(név)-el érhető el, és a .pro fájlban meg fog jelenni hozzá a szöveg
- Betöltése:
// Rendszer nyelvének lekérdezése QString locale = QLocale::system().name(); // Megfelelı fordítás betöltése (pl. myapp_hu.qm) QTranslator translator; translator.load(QString("myapp") + locale, qApp->applicationDirPath()); // Fordítás beállítása app.installTranslator(&translator);
- Alkalmazás beállítások: Platformfüggetlen, oda menti, ahova az adott platformon kell
- QSettings
- Példa:
QSettings settings; // Nézet aktuális méretének elmentése settings.beginGroup("MainView"); settings.setValue("size", size()); // Még egy beállítás (pl. aktuális fájl) settings.setValue("lastFile1 ", ""); settings.endGroup(); // Betöltés: QString lastFile1 = settings.value("lastFile1").toString();
- Mobile Extension: Telefonspecifikus dolgokra API
- Bearer Management: Hálózati elérés
- Contacts
- Publish and Subscribe: Hierarhikus adattárolási rendszer
- Location
- Messaging
- Multimedia
- Service Framework
- System Information
- Sensors
- Camera
- Versit
- Példa:
XQTelephony *telephony = new XQTelephony(this); telephony->call("+3619464763259");
Java ME
MIDlet életciklus
- Állapotok:
- Paused
- Active
- Destroyed
- Átmenetek:
- startApp()
- pauseApp()
- destroyApp()
JSR-ek általában
Opcionális csomagok, amelyeket vagy támogat a telefon, vagy nem. Pl.:
- Bluetooth
- File
- PIM
- WS
UI
Lehetőségek rajzolásra:
- Beépített elemek (Szűkös készlet)
- Saját rajzoló (Canvas alapon)
Beépített elemek használata:
- Displayable: a kijelző tartalma
- Screen vagy Canvas
- Screen lehet:
- Form
- TextBox
- List
- Alert
- Elemek (Item) lehet:
- TextField
- StringItem
- ImageItem
- ChoiceGroup
- DateField
- !Gauge
- Fontosabb metódusok:
- append(Item): Elemet lehet hozzáadni egy konténerhez
- Display.getDisplay(this).setCurrent(Displayable): Megjeleníti a Displayable-t
- Gombnyomás kezelés:
- startCommand = new Command("Start",Command.SCREEN, 1);
- Displayable.addCommand(startCommand);
- Displayable.setCommandListener(CommandListener);
- CommandListener: public void commandAction(Command c, Displayable d){...}
Canvas alapú:
- Canvas osztályt kell kiterjeszteni
- Felülírni a public void paint(Graphics g) metódusát
- public void keyPressed(int keyCode)-val lehet billentyűlenyomást kezelni
LCDUI:
- Vannak beépített elemek, ezek mindenhol használhatóak
- Mobilra optimalizált
Adattárolás
- Háttértár
- Személyes adatok
- Alkalmazáshoz tartozó adatbázis: Record Management System
- Byte-ok tárolhatóak csak
- RecordStore.openRecordStore(String recordStoreName, boolean createIfNecessary)
- Írhatunk egy ByteArrayOutputStream-be egy DataOutputStream-en keresztül, és annak a toByteArray()-al visszakapott tartalmát írjuk ki
- rs.setRecord(1, data, 0, data.length);
- byte[] data = rs.getRecord(1);
- DataOutputStream/Input-nak a writeUTF és readUTF használható
PIM API
- TODO, Calendar, Contacts
- Item-eket tartalmaz
- Az Item-eknek Field-jeik vannak
- PIM.getInstance()-val kérhető
- openPIMList(String)-el nyitható meg az adatbázis
- PIMList:
- getSupportedFields
- getSupportedAttributes
- items
- PIMItem:
- getFields
- getAttributes
- commit
Példakód:
PIM singleton = PIM.getInstance(); cl = (ContactList)singleton.openPIMList(PIM.CONTACT_LIST, PIM.READ_ONLY ); Enumeration contactsEnum = cl.items(); while( contactsEnum.hasMoreElements() ) { Contact contact = (Contact) contactsEnum.nextElement(); get_listContacts().append(contact.getString( Contact.FORMATTED_NAME, 0 ),null); }
Fájlkezelés
- FileConnection objektumon keresztül
- Fájl létezik-e: connection.exists()
- Könyvtár létrehozása: mkdir()
- Fájlba írás: connection.openOutputStream() ... .write(byte[])
- Fájlból olvasás: connection.openInputStream() ... read(byte[])
- Könyvtár listázása: list()
Generic Connection Framework
- Connector.open(String connectionString)-el lehet kapcsolatot nyitni
- Castolni kell
Wireless Messaging API
SMS küldése:
String url = "sms://+36202445695"; MessageConnection conn =(MessageConnection)Connector.open(url); TextMessage msg = (TextMessage)conn.newMessage(MessageConnection.TEXT_MESSAGE); msg.setPayloadText(aText); conn.send(msg);
Bluetooth
Készülékek kilistázása:
LocalDevice localDevice = LocalDevice.getLocalDevice(); discoveryAgent = localDevice.getDiscoveryAgent(); discoveryAgent.startInquiry(DiscoveryAgent.GIAC, DiscoveryListener);
DiscoveryListener:
- public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod)
- public void servicesDiscovered(int transID, ServiceRecord[] servRecord)
- public void serviceSearchCompleted(int transID, int respCode)
RemoteDevice:
- getFriendlyName(true)
Multimédia, Player
- Manager
- Player
- Control
Hang lejátszása(4000ms, 100-as hangerő):
- Manager.playTone(ToneControl.C4, 4000, 100);
Player készítése:
- Manager.createPlayer(String locator);
Player állapotai:
- Unrealized
- Realized
- Prefetched
- Started
- Closed
Controlok:
- player.getControl(String) -el lehet elkérni
- Letehetők Displayable-ra
Webszolgáltatások
WSDL-ből le kell generálni a hívható kódot, majd meghívni
-- sashee - 2010.04.11.