How to able to run service applications on all OS versions
ServiceクラスのonStartメソッドはdeprecated(非推奨)に指定され、Android2.1以降では使うべきではないメソッドになってしまいました。実際にAndroid2.1以降ではonStartメソッドが呼ばれないことがあります。
代替メソッドとしてonStartCommandメソッドが用意されましたが、Android1.6にはonStartCommandメソッドがありません。
1.6以降のどのAndroidでも同じように動作するサービスアプリケーションを作るには、onStartメソッドとonStartCommandメソッドの両方を実装します。
1.6以降のAndroidに対応させるので、プロジェクトのBuild TargetはAndroid1.6(API Level 4)とします。
以下はサンプルです。
サービスクラス(MyService.java)
Activity(Main.java)
マニフェスト(AndroidManifest.xml)
このプロジェクトを実行するとActivity(真っ黒の画面)が表示されている間だけMyServiceクラスが起動します。
実行するとAndroid1.6ではonStartメソッドが、Android2.1以降ではOnStartCommandメソッドが呼ばれます。
Build TargetにAndroid1.6をしていたい場合は、onStartCommandメソッドはオーバーライドせずに(@overrideアノテーションを書かずに)コーディングします。
Eclipseを使う場合、[ソース]-[メソッドのオーバーライド] メニューを開いてもonStartCommandメソッドは選べません。メソッド名や引数を間違えないようにAndroidリファレンスからコピーします。
onStartCommandメソッドを使う上で特に注意することがあります。
サービスはOSによってrestartされることがあるのですが、restartされたときに呼ばれるonStartCommandメソッドの引数 intent は null です。
(return START_STICKY; と指定した場合)
Android1.6とAndroid2.xとでは、restartされたときの引数の内容が異なります。
また、Android1.6では「No more background processes」によりrestartされてもonStartメソッドが実行されないことがあります。
Android1.6のサポートが難しくなってきました。
以上、参考になれば幸いです。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。