Mobilszoftverek - ZH utáni anyag kidolgozása
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.
IPhone
Lehetőségek
- Hátrányok
- Egy third-party program futhat csak
- Sanboxban futnak a programok
- Nincs swap
- Nincs java
- Alkalmazástípusok
- Webes
- Natív
- Hibrid: WebView-ban van a webes rész megjelenítve
- View, ViewController
- UIView
- Tartalom rajzolás
- Hierarhia
- UIWindow: Az ablak
- UIViewController
- Nézet állapotának kezelése
- Adatok és megjelenítés kapcsolata
- Elforgatás kezelése
- Események kezelése
- Fontosabbak: UINavigationController(bejárás), UITabBarController, UITableViewController
- UIView
Objective C
- Dinamikus
- id típus: Bármilyen típus szerepelhet a helyén
- Dinamikus üzenetküldés: Runtime lesz kiválasztva a célpont
- OO
- .h file: interface: változók+metódusok
- .m file: Metódusok (üzenetek) kifejtése
- Példa:
#import <UIKit/UIKit.h> @class MyViewController; @interface AppDelegate : NSObject { BOOL windowDisplayed; IBOutlet UIWindow *window; IBOutlet MyViewController *viewController; } + (AppDelegate*)appDelegate; @property (nonatomic, retain) UIWindow *window; @property (nonatomic, retain) MyViewController *viewController; - (void)applicationDidFinishLaunching:(UIApplication *)application @end
- #import
- @.. direktíva:
- @interface ... @end: Interface leírás
- @property
- @class
- Metódusok:
- +:osztálymetódus
- -:példánymetódus
- Nincs osztályváltozó
- Tagváltozó scope-ja:
- @public
- @protected
- @private
- Példa:
//Property: Metódus+accessorok label.superview.window.backgroundColor = [UIColor whiteColor] // Attribútumokkal testreszabható: Pl.: @property (readonly) BOOL transitioning
- Osztály file példa:
#import "AppDelegate.h" #import "MyViewController.h" @implementation AppDelegate @synthesize window, viewController; - (void)applicationDidFinishLaunching:(UIApplication *)application { [window addSubview:viewController.view]; [window makeKeyAndVisible]; } #pragma mark - #pragma mark NSObject overrides - (void)dealloc { [window release]; [viewController release]; [super dealloc]; } @end
- @implementation és @end direktívák között
- Metódusokat 'self'-en keresztül érhetjük el
- Példányosítás:
- Memória lefoglalása:
+ (id)alloc;
- Inicializálás:
- (id)initWithArray:(NSArray *)array copyItems:(BOOL)flag
- Vagy lehet Factory-n keresztül:
+ (id)arrayWithObject:(id)anObject;
- Memória lefoglalása:
- respondsToSelector: Ellenőrízhető, hogy adott üzenetre tud-e válaszolni
- Protocol (~mint máshol az interface): Több üzenet összegyűjthetó egy protokollba, és ezek egyben ellenőrízhetőek
- Példa:
@protocol processedInfo - (BOOL)processed; - (float)processedRate; @end ... if ([object conformsToProtocol:@protocol(processedInfo)]) {...}
- Category: Osztály kiegészítése leszármaztatás nélkül (tehát az eredeti osztály metódusait írjuk felül)
- Memóriakezelés:
- Nincs GC
- retain, release, dealloc
- Birtoklás: A programozó birtokol egy objektumot ha ő hozta létre, vagy küldött rá retain-t
- Problémák
- Retain körök: Így nem lehet felszabadítani, weak referencia kell az egyik irányban
- Visszatérési érték üzenethívásból: A hívott nem tudja felszabadítani, mert ekkor még nem volt esélye a hívónak lefoglalni.
- NSAutoReleasePool: retainCount-ot csak akkor csökkenti, amikor a Pool-t elhagyja
- For ciklus:
for (id element in array) { NSLog(@"element: %@", element); }
- Típusok:
- id
- Class
- SEL
- IMP
- BOOL
- NSInteger,...
- NSString
- CocoaTouch: OSX fő programozói frameworkjei
- String kezelés
- Kollekció kezelés:
NSArray* array = [[NSArray alloc] initWithObjects:@"A","B",[NSNull null],[NSNumber numberWithBool:NO],nil];
- NSDictionary: Kulcs-érték párok
Adatkezelés
- NSFileManager
- Property list:
- XML file
- arrayWithContentsOfFile
- dictionaryWithContentsOfFile
- Key-Value Coding: Kulcs-érték párok
- Key-Value Observing: Értesítés változásokkor
- Core Data: Objektumokat lehet lementeni
- Olyasmi mint az OR, de nem kompatibilis vele
- NSManagedObjectContext: Lekérdezés, undo, memóriában tartott objektumok kezelése
- Példa:
NSManagedObjectContext* moc = [[DataManager defaultManager] managedObjectContext]; NSEntityDescription* categoryEntity = [NSEntityDescription entityForName:@"Category" inManagedObjectContext:moc]; NSFetchRequest* request = [NSFetchRequest new]; [request setEntity:categoryEntity]; NSPredicate* notEmptyPredicate = [NSPredicate predicateWithFormat:@"drinks.@count > 0"]; [request setPredicate:notEmptyPredicate]; NSSortDescriptor* sortByName = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; [request setSortDescriptors:[NSArray arrayWithObject:sortByName]]; [sortByName release]; NSError* error = nil; NSArray* result = [moc executeFetchRequest:request error:&error]; if (error) { NSLog(@"Error whil fetching: %@",error); }
Hálózatkezelés
NSURL url = [NSURL URLWithString:@"http://images.apple.com/home/images/ipad_hero_20100403.png"]; NSURLRequest* request = [NSURLRequest requestWithURL:url];
- RunLoop: Eseménykezelés
- XML parsolás
- JSON parsolás: Nincs beépített
Hangkezelés
- Core Audio
- Audio Session: Hang kezelése
- Alapértelmezések: Némuljon el, amikor kell
- Néha nem jók az alapértelmezések, ekkor felülírhatóak
- Interruptok: Pl jön egy hívás, aztán vége
- System Sound Services: <30s-es lejátszások
- AVAudioPlayer: Nincs megkötés
- Audio Queue Services: Felvételre
Videólejátszás
- MPMoviePlayerController osztály
Notification-ök
- Publish/Subscribe modell
- Szinkron működés
Android
Activity-k
Erőforrások
A különböző erőforrásokat a könyvtárstruktúrába elhelyezve egy R nevű osztály jön létre, ami hivatkozásokat tartalmaz. (pl. R.drawable.myPicture)
View-ok
Egy képernyőelrendezés megjelenítése. Lehet kódból, vagy erőforrásfájlból létrehozni (~XAML). setContentView(..)-el lehet aktiválni.
Hardverfüggetlenség
Hardverfüggetlenséget az erőforráskönyvtárak elnevezésével lehet elérni, általános alakjuk: név-szűkítés (pl: drawable-qwerty, ha qwerty billenyűzet aktív, akkor az R.drawable ide fog mutatni)
Életciklus
- onCreate
- onStart
- onResume
- Running
- onPause
- onStop
- onRestart
- onDestroy
Adattárolás
- Shared Preferences:
SharedPreferences mySharedPreferences = getSharedPreferences(“MySavedPrefKey”, Activity.MODE_PRIVATE); SharedPreferences.Editor editor = mySharedPreferences.edit(); editor.putBoolean(“isTrue”, true); editor.putFloat(“yourAvg”, 1f); editor.commit();
- onSaveInstanceState:
- onStart és onRestart megkapja az elmentett értékeket egy Bunle-ban
Intentek, Intent filterek
Intent: Activity-re váltás futásidejű kötéssel.
Intent myIntent = new Intent(); myIntent.setClassName("bute.examples.activities","bute.examples.activities.SecondActivity"); //package és osztály myIntent.putExtra("MyValue", "Hi there!"); startActivity(myIntent);
Leírói:
- Action
- Category
- Data
Intent filter: Megmondja, hogy milyen Intenteket ad az alkalmazás
Content Providerek
Adattárolásra.
Cursor c=getContentResolver().query(uri,null,null,null,null); startManagingCursor(c); if(c.moveToFirst()){ int idx=c.getColumnIndexOrThrow(String); String data=c.getString(idx); }
Beszúrás:
ContentValues v=new ContentValues(); v.put(kulcs,ertek); getContentResolver().insert(hova,v);
Adatkötés
Animáció
- Tweened: transzformáció
- Frame-by-frame: képek egymás után
Broadcast Receiver
Globális eseményekre figyel. Intent filterként van beállítva, hogy pontosan mikre is.
IntentFilter filter = new IntentFilter(GO_ON_STRIKE); myBroadcastReceiver r = new myBroadcastReceiver(); registerReceiver(r, filter);
Notification
Activity indítása nélkül tájékoztatja a felhasználót.
String svcName = Context.NOTIFICATION_SERVICE; NotificationManager notificationManager; notificationManager = (NotificationManager)getSystemService(svcName); int icon = R.drawable.icon; String tickerText = “Showing text to the user”; // Az extended status bar-on levő sorrend kialakításához long when = System.currentTimeMillis(); Notification notification = new Notification(icon, tickerText, when); C ontext context = getApplicationContext(); String expandedText = “Here I explain why to bother the user”; String expandedTitle = “The title for the expanded view”; Intent intent = new Intent(this, MyActivity.class); //statikus fv-nyel szerzünk PendingIntentet (context, req. code, intent, flags) PendingIntent launchIntent = PendingIntent.getActivity(context, 0, intent, 0); notification.setLatestEventInfo(context, expandedTitle, expandedText, launchIntent);
Location-based Services
Helymeghatározáshoz
LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
Legjobb Provider kiválasztása:
Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_COARSE); criteria.setPowerRequirement(Criteria.POWER_LOW); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setSpeedRequired(false); criteria.setCostAllowed(true); //csak az enabled providereket String bestProvider = locationManager.getBestProvider(criteria, true);
Legutolsó mérési adat:
Location location = locationManager.getLastKnownLocation(provider); if (location != null) { double lat = location.getLatitude(); double lng = location.getLongitude(); }
Frissítés kérése:
locationManager.requestLocationUpdates(provider, time, distance, new LocationListener() { public void onLocationChanged(Location location) {} public void onProviderDisabled(String provider){} public void onProviderEnabled(String provider){} public void onStatusChanged(String provider, int status, Bundle extras){} });
Proximity Alert:
Intent intent = new Intent(ACTION_PROXIMITY_ALERT); PendingIntent pintent = PendingIntent.getBroadcast(this, requestcode, intent, flags); locationManager.addProximityAlert(lat, long, radius, timeout, pIntent);
Geocoding
Postacímről koordináták, valamint fordítva.
Geocoder geocoder = new Geocoder(this, Locale.HU); String streetAddress = “Magyar tudósok körútja 2, Budapest”; List<Address> locations = null; locations = Geocoder.getFromLocationName(streetAddress, maxNumOfResults);
MapActivity, MapView
Térképen jelenít meg helyet. Controlok adhatók hozzá, amivel vezérelni lehet. Overlayek készítése:
- Canvasként rárajzoljuk
- ItemizedOverlay-eket rátehetünk
Köthetjük egy konkrét ponthoz is.
-- sashee - 2010.05.23.