スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。



サンプル課金プログラムの強制終了(ServiceのonStart, onStartCommandでIntentがnullになる)

Google提供のサンプルプログラムが落ちる件。

このページで紹介されているサンプルプログラム。
http://developer.android.com/intl/ja/guide/google/play/billing/billing_integrate.html

まだ環境が整わないけどできるところだけでもと思ってサンプルプログラムを動かすと強制終了することがある。
原因を調査するとService.onStart()の引数Intentがnullになっているからだった。

なぜにnull?

調べてみたら以下のことが書かれていた。
http://android-developers.blogspot.jp/2010/02/service-api-changes-starting-with.html

For compatibility with existing applications, the default return code for applications that are targeting an earlier version of the platform is a special START_STICKY_COMPATIBILITY code that provides the old behavior of not calling onStart() with a null intent. Once you start targeting API version 5 or later, the default mode is START_STICKY and you must be prepared to deal with onStart() or onStartCommand() being called with a null Intent.



英語には自信ありませんが...
(かなり英文をぶったきって訳してます)

既存のアプリケーションの互換のためデフォルトでは若いAPIバージョン向けのアプリケーションではSTART_STICKY_COMPATIBILITYを返す。
(訳者:若くないAPIバージョンはこの後にでてくる)
これは引数IntentがnullでonStart()を呼び出さない昔の行為を解決するためのコードです。
あなたがAPIバージョン5以降をターゲットにしているとき,デフォルトの値はSTART_STICKYです。
このためあたなはonStart()かonStartCommand()で引数がnullで呼ばれることを準備しなければならない。


で課金のサンプルコードはonStart()で実装していたので,nullになっていたということです。

ではなぜnullになるのか...。

http://developer.android.com/intl/ja/reference/android/app/Service.html#START_STICKY

ここに書かれているように,サービスが死んでも再生成するよ。
でもIntentは保管していないから,再起動時はnullで呼ばれるよ。
ということです。

stickyってのは粘着性のっていう意味なので
ゾンビのように復活するつーことでしょうか...。


さっきのBlogに書いてあったSTART_STICKY_COMPATIBILITYは...

http://developer.android.com/intl/ja/reference/android/app/Service.html#START_STICKY_COMPATIBILITY

Constant to return from onStartCommand(Intent, int, int): compatibility version of START_STICKY that does not guarantee that onStartCommand(Intent, int, int) will be called again after being killed.



殺されても再びコールされることは保証されない。


最初からSTICKYにしたくなければ,こっちでええんじゃないかなぁ。

http://developer.android.com/intl/ja/reference/android/app/Service.html#START_NOT_STICKY

Constant to return from onStartCommand(Intent, int, int): if this service's process is killed while it is started (after returning from onStartCommand(Intent, int, int)), and there are no new start intents to deliver to it, then take the service out of the started state and don't recreate until a future explicit call to Context.startService(Intent). The service will not receive a onStartCommand(Intent, int, int) call with a null Intent because it will not be re-started if there are no pending Intents to deliver.



onStartCommand()から戻った後に開始しているときにサービスが殺されたなら,
そして新しいIntentが届いていないなら,
そのときは開始状態からサービスを取り出して(移行して?)
将来,明示的にstartService()されるまで再生成しないよ。
サービスは引数Intentをnullにして呼び出すonStartCommand()を受信しないでしょう。
なぜならばサービスを再生成しないからです。
(もし保留している配送されたIntentがないときは)


つーことで課金のサンプルを自分のコードで使うときはBillingServiceのonStart()を
onStartCommand()に置き換えて,戻り値はSTART_STICKY_COMPATIBILITYもしくはSTART_NOT_STICKYにすればよいと思います。

うぅ早く課金テストしたい。
関連記事
スポンサーサイト

テーマ : ゲーム開発
ジャンル : コンピュータ




コメントの投稿

非公開コメント

アクセス
あなたは
キーワード
カテゴリー
最近の記事
リンク
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

WEB検索
Google

RSSフィード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。