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