So richtig scheinen die Unterschiede nicht klar geworden zu sein, oder? Ein Bundle stellt Code zur Verfügung, den du nutzen kannst. Ein Service ist eine Instanz einer Klasse die du über ein Interface benutzt.
Den Code musst du daher selbst benutzen, sprich die Instantiierungslogik liegt bei dir. Das macht natürlich in vielen fällen gar keinen Sinn, da du nicht wissen willst, wie der Service intern aufgebaut ist, ob er mit einer Datenbank arbeitet usw. D.h. du willst eigentlich nur seine Funktionalität nutzen, die er dir unter einem bestimmten Interface anbietet. Der OSGi Container ist also dafür zuständig die Services zu aktivieren usw.
Benutzt du ein einfaches Bundle benutzt du quasi einfach Code. Commons-lang könnte z.B. so ein Bundle sein, welches du in deinem eigenen Bundle wiederverwendest. Ebenso Hibernate usw. Wenn du jetzt aber eine Applikation schreibst, die einen Persistenzmechanismus verwendet könntest du dies in ein Bundle packen, dass diese Funktionalität über ein entsprechendes DAO Interface anbietet. Das einzige was dich dann z.B. in einem Clientbundle noch interessiert ist das Interface und die Funktionaltät der Persistierung. In dem Fall würdest du dir über die ServiceRegistry einen Service holen, der dieses Interface implementiert, egal welcher das dann auch immer sein mag.
IMHO kann man in etwa folgende Grenze ziehen (die natürlich nicht immer gilt, aber als grobe Guideline dienen kann): Bibliotheken sind Codebundles, fachliche Bundles eher Servicebundles.
Gruß
Ollie
P.S.: Vielleicht ein schlechtes Beispiel: Pizzaservice VS. Pizza selber backen. Beim Pizzaservice interessiert dich nur das Interface und du wählst einen beliebigen aus der Registry (Telefonbuch) aus. Beim selberbacken benutzt du (fremde) Zutaten, ein Rezept (Code) usw. und bereitest sie selbst zu (Instantiierung bei dir). Ich gebe zu, der Vergleich hinkt etwas, wenn man weiter ins Detail geht aber so grundsätzlich sollte der Unterschied daran deutlich werden.