Monday, February 8, 2010

 

Android vs. iPhone: A Developer's Perspective, part II

Android vs. iPhone: A Programmer's Perspective - II


(See also Part I.)


OS features

The big winner here is Android, due to its multitasking. You can call other apps, eg a browser or a file-system picker, get results from them, and use those results in your own app; all these things are completely impossible on the iPhone, where (aside from a few special cases like iTunes) only one app may run at a time. (And even if you want to sacrifice yourself to launch another app, you can only do so in very restricted circumstances - if they have registered a URL scheme.)

The browser special-case is worth mentioning; you can include browser windows in your own app, and mine do so in a few different places - but this is often not as full-featured or convenient to the user as opening up the full Safari browser.

You can also write Android services that run in the background, and you can launch them at boot time (if the user permits) by registering for the BOOT_COMPLETED intent. What it doesn't really, provide, though, is "push" notifications (other than by faking it with eg Comet HTTP Push) which the iPhone does offer. That's the iPhone's only advantage in this category, though.


Phone features

The iPhone is locked down. You don't get direct Bluetooth API access; you do in Android. You don't get direct SMS access; you do in Android. For security reasons, they claim in Cupertino. At least (like Android) it now lets you access the proximity sensor.

But to its credit, the features it does offer are a joy to work with. In particular, the built-in camera/preview screen (for iPhone) / picture selector (for iPod Touch) is excellent, and requires all of a half-dozen lines of code to launch and respond to. The Android camera code, last I looked at it, was much more complex.

Location management is a little messy and complex on both systems, but overall Android's registration model is easier to work with than the iPhone's delegation model.

The iPhone SDK comes with this daft notion that all settings for all apps should probably be in a single System Settings screen accessible from the main menu; you can roll your own, but it's inconvenient. Android, by contrast, lets you create a settings screen by simply writing XML, no Java required unless you want to customize it. On the other hand, the iPhone simply makes "your default settings" available, whereas Android provides the possibility of multiple sets, which is doubtless more flexible and powerful but also more annoying to work with.

Accessing system and app resources (eg image files) is a little counterintuitive on Android; at compile time, it scans a predetermined bunch of directories, and automatically builds an "R" file with a bunch of final static ints, each of which uniquely identifies a resource; you then use those in code to access resources. (There's also an Android.R for built-in-resources.) This is confusing at first, but fine once you get used to it.

The iPhone makes the basics easy for you in code -
[Image imageNamed:@"myImage.png"]
- but if you want to go beyond that, the whole resource-bundling thing is less than intuitive, and while I had no trouble accessing bundle resources, I never felt like I had a clear idea of what was actually going on, unlike with Android.


Screen building

No sense pussyfooting around: when it comes to actually building the screens of your app, the iPhone has a massive advantage. It provides an excellent WYSIWYG tool, and the components it offers - buttons, lists, etc - mostly just look a whole lot nicer and sexier than the Android ones.

(That said, I have two minor complaints about the iPhone UI components: 1) No drop-down options in menus - instead you either have to code an ActionView or use one of the huge screen-eating spinners. 2) The absence of a border around TextViews does not look good and just serves to confuse users.)

In general, though, the iPhone wins here. The delegate model of TableViewController gives you powerful and fine-grained control far more easily than the adapter model of ListActivity. As far as "complicated, hard-to-work-with, but useful subclasses of your basic list view" goes, I'll take the iPhone's LocalizedIndexedCollation over Android's ExpandableListView, though I sure wish both were more developer-friendly.

And then there's maps. Jeez. In iPhone, if you want to add a custom marker for a map, then in the ViewController for that screen, you just override a method and write six lines of code:

- (MKAnnotationView *)mapView:(MKMapView *)myMapView viewForAnnotation:(id )annotation {
NSString viewImageName=@"myImage.jpg";
MKAnnotationView *myView = (MKAnnotationView*)[myMapView dequeueReusableAnnotationViewWithIdentifier:viewImageName];
if (myView==nil) {
myView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:viewImageName] autorelease];
myView.image = [UIImage imageNamed:viewImageName];
}
return myView;
}


In Android, first you have to write a whole new inner class that extends ItemizedOverlay, eg:

class ListingsOverlay extends ItemizedOverlay {
private ArrayList overlays=new ArrayList();

public ListingsOverlay(android.graphics.drawable.Drawable defaultMarker) {
super(defaultMarker);
}

public void addOverlay(OverlayItem overlay, Drawable marker) {
super.boundCenterBottom(marker);
overlay.setMarker(marker);
overlays.add(overlay);
}

// necessary because populate() is protected
public void doPopulate() {
populate();
}

@Override
protected OverlayItem createItem(int i) {
return(overlays.get(i));
}

@Override
public int size() {
return(overlays.size());
}


and then something like this:


mapView = (MapView) findViewById(R.id.mapview);
mapOverlays = mapView.getOverlays();
mapOverlays.removeAll(mapOverlays);

Drawable drawable = getResources().getDrawable(R.drawable.map_fave);
itemizedOverlay = new ListingsOverlay(drawable);
OverlayItem overlay = new OverlayItem(point, mappable.getIDString(), mappable.getMapDetailText());
Drawable marker = MappableItem.GetMarkerForMappable(ITRMapView.this, mappable.getCategory());
itemizedOverlay.addOverlay(overlay, marker);
itemizedOverlay.doPopulate();


Menus and navigation are also easier and prettier on the iPhone; you can add sleek-looking buttons and toolbars and simply set them to call the selector of your choice, and you get a great NavigationController for iTunes-like interfaces, plus sexy animation. No real equivalent on Android.

On the other hand, Android's XML layouts, while tedious and irritating, and not as pretty or near as exact as the iPhone's WYSIWYG, do work well once you get the hang of them - and they make it much easier to support multiple screen sizes and different orientations. (My iPhone app simply doesn't do landscape orientation; my Android app handles it almost perfectly, without me ever having thought about it.) This wasn't a big deal for the iPhone until last month - but apps that previously were confident of a 320x480 screen now have to deal with the iPad.


The Internet

Accessing web services and launching in-app web views is easy and effective in both Android and iPhone. Edge to the latter, though; there are a couple of weird little bugs with Android's WebViews (though they can be worked around with ease) and the iPhone gives you both more SDK options and better documentation.


Release

Building an iPhone app is kind of scary. You're suddenly reminded that under the hood it's terrifying C++; the "Build" screens are full of dozens if not hundreds of byzantine, cryptic, intimidating options for compiling, precompiling, linking, etc., and you find yourself desperately hoping you've set up your import libraries perfectly and suddenly very careful not to touch anything.

That said, XCode works really well. (Have I mentioned that debugging is far easier with the iPhone SDK? Debugging is far easier with the iPhone SDK. With Android I usually wind up resorting to debugging with log messages.) What does not work really well is Apple's paranoid certification hegemony. God forbid that anyone run an app without going through the App Store!

So you need to go to Apple's site and futz around with it and with device IDs and create and download separate certificates for debug and release, and your temporary "provisioning" device certificates expire every three months, and while it is theoretically possible to build an app for someone else's device, email it to them, and have them install it, I have yet to actually succeed at this, despite repeated attempts. (It's somewhat easier if their device is plugged in to your machine.)

You know how it works on Android?
- You build your app.
- You sign your app. (Which Eclipse can take care of with a simple wizard.)
- Anyone in the whole world who wants to can now download and run the app.

There's a slight pitfall if you're working with Google Maps - you have to jump through hoops like Apple's to create separate debug and release Maps API Keys, and ensure you're using the right one - but by and large, it's miles easier and better than trying to finagle your way into Apple's walled garden.

Plus, if you've built an app and released it, and found some sort of subtle bug? With Android, you can fix that and have a new version up on the Android Market in five minutes. With Apple, it's ... a week? A month? Who knows? App Store approval is an infuriating black box.


Overall

They're both excellent systems. They both have their pros and cons. Overall I would rate the iPhone as better, both in terms of what you can do with it and how - but Android is superior in fundamental ways (eg multitasking and memory management) and catching up fast in terms of results. If Apple doesn't watch out, and move fast, they're going to find themselves superseded soon. Maybe this year.

Labels: , , , , , , , , ,


Comments:
the n900 pretty much wins all the way down the line, till you get to the bit where you release your app into the app store (which is so dismal it might as well not exist). i really hope they get that fixed, because it's a joy to develop for. (releasing into the repositories is always an option, of course, but you can't get paid for that. i hear they're working on a centralised donation platform to supplement the repositories, so you can open source your app and still make some money off it). also, you can write your app in a variety of languages, including anything gcc supports, python, vala (my current choice) and gambit scheme. for the gui you have a choice of gtk (currently the 'official' api), qt (the upcoming official api) and if you're more into games, opengl and sdl. no good cross-compilation ide yet (the next version of qtcreator will support crosscompiling to maemo) but the scratchbox emulator is pretty good, it gives you a linux environment in which to compile and debug your app.
 
Dude, great article! I appreciate the detailed examples you've provided as well as the breadth you've covered. Cheers!
 
Yep totally agree. Balanced, informative and very useful - Thanks for taking the time to share your thoughts
 
What is amazing about Android is exactly how awfully bad the Android MAPVIEW is... It is abysmal.

I have written an IPHONE app with thousands of annotations on the screen if you are zoomed out enough and it loads and responds and is useful.. Attempting to port this to Android has become a giant fusterCluck. The Mapview takes forever to display the screen, and is virtually unresponsive with only a few thousand itemizedOverlays.. I can't get this app running with less than a tenth of the annotation data the Iphone equivalent is running with.

Given Google owns both Google Maps, and the Android OS, it is amazing how god awfully bad these features are on their Android system vs the Iphone libraries. And you better make sure you seperate your populate() from your addOverlay() in your custom ItemizedOverlay implementation or you will be waiting weeks to simply load a few hundred overlays.

I can live with some kludginess that comes with Androids XML/opensource java approach, but I cannot accept this horrificly useless execution.

I've been working fulltime almost exclusively with Java since 1997, so I am no stranger to the Java language... And I think Objective C is a rediculous hack, however I cannot remotely, say as a developer, that Android is remotely on par with IPhone. This isn't simply a matter of its simpler code for the WSYWIG that Iphone gives you as mentioned in this article, its that the Iphone can actually handle what its being asked to do, while Android clearly cannot.

My biggest complaints with IPHONE development has been Objective C (as I said above, it is a rediculous hack IMHO), and the Interface Builder (nice product, but when it horks up, it really horks up, and good luck finding out what to change in the underlying XML files to fix it).
 

Post a Comment

Subscribe to Post Comments [Atom]





<< Home

This page is powered by Blogger. Isn't yours?

Subscribe to Posts [Atom]