Mobilszoftverek - ZH utáni anyag kidolgozása

A VIK Wikiből

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

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