音楽プレイヤー (2/4)
10日でおぼえる Androidアプリ開発入門教室 Android SDK2.3対応
の「CHAPTER 09 音楽プレイヤーを作ろう」の2つめ
前回のLESSON とはアプリの見た目は同じです。
違うのは、アプリをバックグラウンドにした場合、つまり、例えば、アプリの実行中に Android のホームを表示した場合などの動作です。バックグラウンドにすると前回は音楽再生が停止しました。これが、今回は停止しないで演奏を継続します
この大きな違いは Service を使うことで実現しています。
また、拡張子 AIDL をもつファイルも初登場しました。
AIDL は " Android Interface Definition Language" だそうです。
Eclipse の Explore 上では
のように Java のような登録済のファイルとして認識されていません。しかし、問題なく Build されて gen/ の下に拡張子が aidl → java になったファイルが生成されました
deprecated なメソッドの対策は今までもあった下記2つ
・constructor CursorAdapter(Context, Cursor)
・managedQuery(Uri, String, String, String, String)
(補足)対策は 2014/11/9(日) のブログ
に加えて、Service 導入に伴う新しいものが一つ現れました。
・The method onStart(Intent, int) from the type Service is deprecated
onStart()は Service クラスのメソッドで、本家のサイトによると
サンプルコード全体を確認すると、親クラスのメソッドをコールしているだけだったので、深く考えずに、onStartCommand() に置き換えて回避しました。
●修正前
● 修正後
以上の修正だけで動けば楽だったのですが、アプリを起動するといきなり
このデバッグで1週間経過してしまいました。
# 丸1日これだけに集中できれば1~2日といったところでしょうか
デバッガが表示するスタック情報はあいかわらず自分には理解不能な内容でした このため、今回もコードの実行フローを多少は理解しながら、ブレークポイントで問題箇所を狭めていきました。
結局、直接の原因は下記 findViewById() が null を返していることだと判明しました。
では、findViewById() が null を返す理由はというと、setContentView()が事前に正しく実行されていないことが考えられるとのこと。
setContentView()は前回の LESSON での相当箇所では、
で、模範回答に含まれる
res/layout/main.xml
を確認すると9行目に下記が追加されていました。
なお、list.xml には最初から
模範解答との差分は java だけでなく、リソースの xml も対象にしないといけませんね
# 本の解説にも XML を編集するようにとの記載を見つけられなかったのだが…
の「CHAPTER 09 音楽プレイヤーを作ろう」の2つめ
LESSON 33 ディスプレイオフでも曲が聴けるようにしよう
の動作を確認しました。前回のLESSON とはアプリの見た目は同じです。
違うのは、アプリをバックグラウンドにした場合、つまり、例えば、アプリの実行中に Android のホームを表示した場合などの動作です。バックグラウンドにすると前回は音楽再生が停止しました。これが、今回は停止しないで演奏を継続します
この大きな違いは Service を使うことで実現しています。
また、拡張子 AIDL をもつファイルも初登場しました。
AIDL は " Android Interface Definition Language" だそうです。
Eclipse の Explore 上では
のように Java のような登録済のファイルとして認識されていません。しかし、問題なく Build されて gen/ の下に拡張子が aidl → java になったファイルが生成されました
deprecated なメソッドの対策は今までもあった下記2つ
・constructor CursorAdapter(Context, Cursor)
・managedQuery(Uri, String, String, String, String)
(補足)対策は 2014/11/9(日) のブログ
に加えて、Service 導入に伴う新しいものが一つ現れました。
・The method onStart(Intent, int) from the type Service is deprecated
onStart()は Service クラスのメソッドで、本家のサイトによると
This method was deprecated in API level 5. Implement onStartCommand(Intent, int, int) instead.とのことでした。
サンプルコード全体を確認すると、親クラスのメソッドをコールしているだけだったので、深く考えずに、onStartCommand() に置き換えて回避しました。
●修正前
42 @Override
43 public void onStart(Intent intent, int startId) {
44 super.onStart(intent, startId);
45 }
● 修正後
42 @Override
43 public int onStartCommand(Intent intent, int flags, int startId) {
44 return super.onStartCommand(intent, flags, startId);
45 }
以上の修正だけで動けば楽だったのですが、アプリを起動するといきなり
"Unfortunately, Chapter09 has stopped."
で異常終了でした。このデバッグで1週間経過してしまいました。
# 丸1日これだけに集中できれば1~2日といったところでしょうか
デバッガが表示するスタック情報はあいかわらず自分には理解不能な内容でした このため、今回もコードの実行フローを多少は理解しながら、ブレークポイントで問題箇所を狭めていきました。
結局、直接の原因は下記 findViewById() が null を返していることだと判明しました。
mSeekbar = (SeekBar) findViewById(R.id.SeekBar01);
では、findViewById() が null を返す理由はというと、setContentView()が事前に正しく実行されていないことが考えられるとのこと。
setContentView()は前回の LESSON での相当箇所では、
setContentView(R.layout.list);に相当する引数で実行されていました。これが今回の問題の箇所では、
setContentView(R.layout.main);に相当する引数で実行されていることが判明。
で、模範回答に含まれる
res/layout/main.xml
を確認すると9行目に下記が追加されていました。
<include layout="@layout/control" />
なお、list.xml には最初から
<include layout="@layout/control" />が含まれていたので、R.layout.list でも @layout/control にアクセスできます。
模範解答との差分は java だけでなく、リソースの xml も対象にしないといけませんね
# 本の解説にも XML を編集するようにとの記載を見つけられなかったのだが…