<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>はらぺこ日誌 &#187; Java</title>
	<atom:link href="https://blog.harapeko.jp/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.harapeko.jp</link>
	<description>株式会社はらぺこ 公式ブログ</description>
	<lastBuildDate>Mon, 30 Oct 2017 14:32:56 +0000</lastBuildDate>
	<language>ja</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.2</generator>
	<item>
		<title>Android プログラミング(5) &#8211; インテント入門</title>
		<link>https://blog.harapeko.jp/2011/09/29/intent-introduction/</link>
		<comments>https://blog.harapeko.jp/2011/09/29/intent-introduction/#comments</comments>
		<pubDate>Thu, 29 Sep 2011 04:29:43 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[活動記録]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=220</guid>
		<description><![CDATA[シリーズとして、下記の書籍にて学習したことについてのメモを綴っています。 Android Hacks &#038;mda [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>シリーズとして、下記の書籍にて学習したことについてのメモを綴っています。</p>
<ul>
<li>
<a href="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X">Android Hacks &mdash;プロが教えるテクニック &amp; ツール<br />
<img border="0" src="http://ws.assoc-amazon.jp/widgets/q?_encoding=UTF8&#038;Format=_SL160_&#038;ASIN=487311456X&#038;MarketPlace=JP&#038;ID=AsinImage&#038;WS=1&#038;tag=harapekoinc-22&#038;ServiceVersion=20070822" /></a>
</li>
</ul>
<p>今回は、「HACK#8 インテント入門」 (p.63～71) の内容について触れていきます。<br />
<span id="more-220"></span></p>
<h3>インテントってなんぞや?</h3>
<blockquote cite="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X" title="Android Hacks &mdash;プロが教えるテクニック &amp; ツール"><p>
<strong>インテント</strong>とはアクティビティやアプリケーション間でのやり取りを行うための仕組みです。インテントを利用することで自アプリケーション内の画面遷移だけでなく、他アプリケーションと連携を取ることができます。
</p></blockquote>
<p>前回までの学習においても、画面遷移の際に (つまり、他のアクティビティを呼び出す際に)、インテントを利用していました。 <code>startActivity()</code> メソッドに渡していたアレですね。</p>
<pre>
        button_to_branch.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                startActivity(
                        new Intent(RootActivity.this, BranchActivity.class) // &lt;- これ。
                        );
            }
        });
</pre>
<p>「HACK#6 アクティビティ入門」においてこのようなコードが紹介された際には、この <code>Intent</code> クラスについては特に説明はありませんでした。</p>
<p>本書で「明示的 INTENT」と呼んでいる方法では、 <a href="http://developer.android.com/reference/android/content/Intent.html#setClassName%28java.lang.String,%20java.lang.String%29"><code>setClassName()</code></a> メソッドを用いて、呼び出そうとするアクティビティのパッケージ名とクラス名を指定しますが、同名のメソッドには<a href="http://developer.android.com/reference/android/content/Intent.html#setClassName%28android.content.Context,%20java.lang.String%29">パッケージ名の代わりに <code>Context</code> オブジェクトを引数に取るもの</a>がオーバーロードされており (<a href="http://developer.android.com/reference/android/app/Activity.html"><code>Activity</code> クラス</a>はこの <code>Context</code> クラスを継承している)、上記のコンストラクタはまさにこの「明示的 INTENT」を実現する 1つの方法と言えるものなのでしょう。</p>
<p>実際、<code>setClassName()</code> メソッドは <code>this</code> を返すので、上記のコードは以下のように書いても同様に動作することが確認できます。</p>
<pre>
            public void onClick(View v) {
                startActivity((new Intent()).setClassName(RootActivity.this,
                        "jp.co.harapeko.testsome.BranchActivity")); // &lt;- クラス名は省略できないっぽい…。
            }
</pre>
<p>次に「暗黙的 INTENT」ですが、</p>
<blockquote cite="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X" title="Android Hacks &mdash;プロが教えるテクニック &amp; ツール">
<pre>
21:            Intent intent=new Intent();
22:            intent.setAction(Intent.ACTION_VIEW);
23:            intent.setData(uri)
24:            startActivity(intent);
</pre>
</blockquote>
<p><code>Intent</code> クラスには<a href="http://developer.android.com/reference/android/content/Intent.html#Intent%28java.lang.String,%20android.net.Uri%29">アクションと URI を指定するコンストラクタ</a>もあるので、この部分は以下のように書くこともできます。</p>
<pre>
            Intent intent=new Intent(Intent.ACTION_VIEW, uri);
            startActivity(intent);
</pre>
<h3>インテントフィルタ</h3>
<p>今度はインテントフィルタを用いて、暗黙的 INTENT を利用して起動するアクティビティを作る方法が解説されています。</p>
<p>前回までの学習において、マニフェスト XML に、書くなと言われたり書けと言われたりしていた <code>&lt;intent-filter&gt;</code> 要素がここにきて登場します。</p>
<pre>
            &lt;intent-filter&gt;
                &lt;action android:name="android.intent.action.VIEW" /&gt;
                &lt;category android:name="android.intent.category.DEFAULT" /&gt;
                &lt;category android:name="android.intent.category.BROWSABLE" /&gt;
                &lt;data android:scheme="http" /&gt;
            &lt;/intent-filter&gt;
</pre>
<p><code>DEFAULT</code> カテゴリは要らんのかなと思ったのですが、消した状態でやってみたら暗黙的 INTENT で呼び出されなくなっちゃいました。<a href="http://developer.android.com/reference/android/content/Intent.html#CATEGORY_DEFAULT">ドキュメント</a>を見てもよくわからなかったのですが <tt>(^_^;</tt>、これがないとデフォルトでは暗黙的 INTENT における起動の対象にはならない、ということなのでしょうか。</p>
<p>対応するスキーマを増やしたい場合は、 <code>&lt;data&gt;</code> 要素を単に増やせばよいようです。</p>
<pre>
                &lt;data android:scheme="http" /&gt;
                &lt;data android:scheme="https" /&gt;
                &lt;data android:scheme="ftp" /&gt;
                &lt;data android:scheme="ftps" /&gt;
</pre>
<p>なお、起動される側のアクティビティにおける実装ですが、</p>
<blockquote cite="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X" title="Android Hacks &mdash;プロが教えるテクニック &amp; ツール">
<pre>
6:        if(!getIntent().getAction().equals(Intent.ACTION_MAIN)){
7:            //暗黙的に起動された場合
</pre>
</blockquote>
<p>ここは以下のように書いた方が良さそうです。</p>
<pre>
        if (Intent.ACTION_VIEW.equals(getIntent().getAction())) {
            // 暗黙的に起動された場合
</pre>
<p><code>if</code> ブロック内の処理内容が VIEW アクションの時にのみ行われるべきものであるから、というのもあるのですが、なによりこのアクティビティが明示的 INTENT から起動した場合、 <code>getIntent().getAction()</code> が <code>null</code> を返すために、サンプルコードのままだと <code>java.lang.NullPointerException</code> 例外が送出されてしまうからです。</p>
<h3>シェルの am コマンドでインテントをテスト</h3>
<p>まとめると、</p>
<ul>
<li><q><code>am start -n </code>(パッケージ名)<code>/</code>(クラス名)</q> &#8230;明示的 INTENT</li>
<li><q><code>am start -a </code>(アクション名)<code> -d </code>(URI) [<code> -t </code>(MIME タイプ)]</q> &#8230;暗黙的 INTENT</li>
<li><q><code>am broadcast -a </code>(アクション名)</q> &#8230;BroadcastIntent
</ul>
<p>といった感じです。</p>
<h3>BroadcastIntent</h3>
<p>アクティビティ以外のクラスを作るのは何気に初めてなんじゃないでしょうか。 Eclipse にもまだあんまり慣れていないので、ここらで新規にクラスを追加する方法をおさらいしてみます。</p>
<ol>
<li>
Package Explorer にて、プロジェクトツリーの「src/(パッケージ名)」を右クリックし、コンテキストメニューから「New &gt; Class」を選択する。<br />
<div id="attachment_217" style="width: 410px" class="wp-caption aligncenter"><a href="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110929-create-new-class-01.png"><img src="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110929-create-new-class-01.png" alt="Eclipse でクラスの新規追加 - コンテキストメニュー" title="Eclipse でクラスの新規追加 - コンテキストメニュー" width="400" height="267" class="size-full wp-image-217" /></a><p class="wp-caption-text">Eclipse でクラスの新規追加 - コンテキストメニュー</p></div></p>
<ul>
<li>プロジェクト名を右クリックして、でも良いのですが、パッケージ名を右クリックしていた場合、次の「New Java Class」ダイアログでパッケージ名を入力する手間が省けます。</li>
</ul>
</li>
<li>
「New Java Class」ダイアログにて、「Name」にクラス名、「Superclass」に継承する基底クラスの完全名称を入力する。<br />
<div id="attachment_218" style="width: 410px" class="wp-caption aligncenter"><a href="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110929-create-new-class-02.png"><img src="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110929-create-new-class-02.png" alt="Eclipse でクラスの新規追加 - New Java Class ダイアログ" title="Eclipse でクラスの新規追加 - New Java Class ダイアログ" width="400" height="334" class="size-full wp-image-218" /></a><p class="wp-caption-text">Eclipse でクラスの新規追加 - New Java Class ダイアログ</p></div></p>
<ul>
<li>今回の場合、基底クラスの名称は「<code>android.content.BroadcastReceiver</code>」ですね。</li>
<li>基底クラスの完全名称がわからない場合はその横にある「Browse&#8230;」ボタンをクリックして表示される検索ダイアログを利用すると便利ですよ。</li>
</ul>
</li>
<li>
クラスのソースファイルが作成されます。オーバーライドが必要なメソッドが始めから用意され、必要な <code>import</code> 文もすべてあらかじめ書かれた状態で作られるので、便利です。<br />
<div id="attachment_219" style="width: 410px" class="wp-caption aligncenter"><a href="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110929-create-new-class-03.png"><img src="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110929-create-new-class-03.png" alt="Eclipse でクラスの新規追加 - 追加されたソースファイル" title="Eclipse でクラスの新規追加 - 追加されたソースファイル" width="400" height="341" class="size-full wp-image-219" /></a><p class="wp-caption-text">Eclipse でクラスの新規追加 - 追加されたソースファイル</p></div>
</li>
</ol>
<h4>FLAG_ACTIVITY_NEW_TASK フラグ</h4>
<blockquote cite="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X" title="Android Hacks &mdash;プロが教えるテクニック &amp; ツール"><p>
基本的には今までと同じように <code>intent</code> を生成しますが、アクティビティ以外からアクティビティを起動する場合には 5 行目のように :</p>
<pre>
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
</pre>
<p>を記述する必要があります。
</p></blockquote>
<p>ここ、さらっと書かれていますが、何気に重要なんじゃないでしょうか。要チェックです。実際、この行無しでビルドして、 BroadcastIntent を発行してみると、以下のログメッセージを伴うような例外が送出されます。</p>
<blockquote title="FLAG_ACTIVITY_NEW_TASK フラグをセットしなかった場合のエラーログ"><p>
09-29 01:15:28.376: ERROR/AndroidRuntime(694): java.lang.RuntimeException: Unable to start receiver jp.co.harapekoinc.testintent.BootReceiver: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
</p></blockquote>
<p>リファレンスにおける <a href="http://developer.android.com/reference/android/content/Context.html#startActivity%28android.content.Intent%29"><code>android.content.Context</code> クラスの <code>startActivity()</code> メソッド</a>の項にも以下のような記述があります。</p>
<blockquote cite="http://developer.android.com/reference/android/content/Context.html#startActivity%28android.content.Intent%29" title="Context | Android Developers"><p>
Note that if this method is being called from outside of an <code><a href="/reference/android/app/Activity.html">Activity</a></code> Context, then the Intent must include the <code><a href="/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK">FLAG_ACTIVITY_NEW_TASK</a></code> launch flag.  This is because, without being started from an existing Activity, there is no existing task in which to place the new activity and thus it needs to be placed in its own separate task.
</p></blockquote>
<p><a href="http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK"><code>Intent.FLAG_ACTIVITY_NEW_TASK</code> フラグ</a>の説明も見ておきましょう。 Back Stack というのがあって、このフラグを指定すると Back Stack に新しいタスクを積むよ、というようなことが書いてあります。 <a href="http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html" title="Tasks and Back Stack | Android Developers">Back Stack についてのドキュメント</a>も目を通しておくと良さそうです。</p>
<h4>実際のシチュエーション</h4>
<p><a href="http://developer.android.com/reference/android/content/Intent.html#ACTION_BOOT_COMPLETED" title="Intent | Android Developers"><code>BOOT_COMPLETED</code> アクション</a>はその名の通り、システム起動時に bloadcast されるアクションです。せっかくなので、システムを再起動して、ここで作ったアプリが自動的に起動するか試してみるといいと思います。エミュレータでやる場合、単にエミュレータを終了して起動し直してもシステムを再起動したことにはなりません。エミュレータの電源ボタンを長押しして、システムのシャットダウンを実行し、シャットダウン中の画面になるのを待ってから終了 (ここで待ち続けても多分終了しません…) し、再開する必要があります。</p>
<h3>まとめ</h3>
<p>そんなわけで今回は Android 公式のリファレンスも合わせて参照しながら進めてみました。学習の中で疑問点を見つけて公式情報に当たるというのはとても大切なことだと思います。</p>
<p>暗黙的 INTENT や BloadcastIntent については若干気になる仕様だなと思いました。開発者サイドとしてはプログラムの実装の中で完全にコントロールできるのでやりやすいっちゃやりやすいのですが、ユーザーに自分で設定できる余地が与えられていないのが気になります。特に BloadcastIntent に関しては、それによって実行される処理がユーザーにとって鬱陶しいと思われるようなものでは恐らく敬遠されるでしょうから、慎重に実装する必要があるでしょうね。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2011/09/29/intent-introduction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android プログラミング(4) &#8211; Activity の有効・無効</title>
		<link>https://blog.harapeko.jp/2011/09/25/activity-enable-and-disable/</link>
		<comments>https://blog.harapeko.jp/2011/09/25/activity-enable-and-disable/#comments</comments>
		<pubDate>Sun, 25 Sep 2011 09:09:13 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[活動記録]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=212</guid>
		<description><![CDATA[シリーズとして、下記の書籍にて学習したことについてのメモを綴っています。 Android Hacks &#038;mda [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>シリーズとして、下記の書籍にて学習したことについてのメモを綴っています。</p>
<ul>
<li>
<a href="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X">Android Hacks &mdash;プロが教えるテクニック &amp; ツール<br />
<img border="0" src="http://ws.assoc-amazon.jp/widgets/q?_encoding=UTF8&#038;Format=_SL160_&#038;ASIN=487311456X&#038;MarketPlace=JP&#038;ID=AsinImage&#038;WS=1&#038;tag=harapekoinc-22&#038;ServiceVersion=20070822" /></a>
</li>
</ul>
<p>今回は、「HACK#7 アクティビティ Hacks」 (p.58～63) の内容について触れていきます。<br />
<span id="more-212"></span></p>
<h3>adb コマンドからアクティビティを起動</h3>
<p><code>adb</code> コマンドですが、<a href="http://blog.harapeko.jp/2011/09/06/android-hacks-1/" title="はらぺこ日誌? ブログアーカイブ ? Android プログラミング(1) - 開発環境の設定まで">SDK をインストール</a>した際にパスを通した <strong><code>tools</code> ディレクトリにはもはや存在しません</strong>。代わりに <code>adb_has_moved.txt</code> というふざけた名前のファイルが置いてあって、開くと次のように書かれています。</p>
<pre>
The adb tool has moved to platform-tools/

If you don't see this directory in your SDK,
launch the SDK and AVD Manager (execute the android tool)
and install "Android SDK Platform-tools"

Please also update your PATH environment variable to
include the platform-tools/ directory, so you can
execute adb from any location.
</pre>
<p>そんな訳なので、先ずはあらかじめ <q>(SDK インストールディレクトリ)<code>/platform-tools</code></q> ディレクトリにもパスを通しておきましょう。</p>
<p><code>adb</code> コマンドを単に実行すると、 <code>shell</code> 以外のサブコマンドの説明も含むヘルプが表示されます。それを読むとわかるのですが、 <code>shell</code> サブコマンドからアクセスできるシェルというのは、<a href="http://blog.harapeko.jp/2011/09/10/android-emurator/" title="はらぺこ日誌? ブログアーカイブ ? Android プログラミング(2) - エミュレータ試行錯誤">エミュレータを弄る回</a>で扱ったエミュレータコンソールとは別物です。ちなみに、エミュレータコンソールのコマンドも <code>adb</code> コマンドの <code>emu</code> サブコマンドから実行できるようです。</p>
<h3>アクティビティの有効・無効を動的に切り替える</h3>
<p>このトピックは致命的なことに、アクティビティが有効になる/無効になると言うことがどういう事なのかがいまいちわかりづらくなっています。現象から言えることは、マニフェストに登録したアクティビティが <code>&lt;intent-filter&gt;</code> 要素を伴ってランチャーにアイコンを表示させるようにしていた場合、アクティビティが有効ならばそのアイコンが表示され、無効ならば表示されなくなる、ということだけでした。<br />
<div id="attachment_207" style="width: 410px" class="wp-caption aligncenter"><a href="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110925-launcher-enable-activity.png"><img src="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110925-launcher-enable-activity.png" alt="もう一つのアクティビティが有効なときのランチャー画面" title="もう一つのアクティビティが有効なときのランチャー画面" width="400" height="285" class="size-full wp-image-207" /></a><p class="wp-caption-text">もう一つのアクティビティが有効なときのランチャー画面</p></div><br />
そこで、メインの方のアクティビティにボタンをもう一つ加えて、そのボタンを押すとサブの方のアクティビティに遷移するようにしてみました。よーするに、<a href="http://blog.harapeko.jp/2011/09/15/activity-introduction/" title="はらぺこ日誌? ブログアーカイブ ? Android プログラミング(3) - Activity 入門">前回</a>の前半でやった内容を組み合わせちゃったわけですね。<br />
参考までに、実際に実装したメインの方のアクティビティクラスの <code>onCreate()</code> ハンドラメソッドを以下に掲載します。</p>
<pre>
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        button_enable_branch = (Button)findViewById(R.id.bt_enable_branch);
        button_to_branch = (Button)findViewById(R.id.bt_to_branch);
        pack_man = getPackageManager();
        com_name = new ComponentName(this, BranchActivity.class);
        is_enable_branch_activity = !(pack_man.getComponentEnabledSetting(com_name) ==
            PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
        setButtonText();
        button_enable_branch.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (is_enable_branch_activity){
                    pack_man.setComponentEnabledSetting(com_name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                        PackageManager.DONT_KILL_APP);
                }
                else {
                    pack_man.setComponentEnabledSetting(com_name, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                        PackageManager.DONT_KILL_APP);
                }
                is_enable_branch_activity = !is_enable_branch_activity;
                setButtonText();
            }
        });
        button_to_branch.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                startActivity(new Intent(RootActivity.this, BranchActivity.class));
            }
        });
    }
</pre>
<p>例によって変数名とかは結構変えてありますｗ。 <code>RootActivity</code> がこのアクティビティで、 <code>BranchActivity</code> が (有効/無効を切り替えられる) サブの方のアクティビティですね。 <code>button_enable_branch</code> がこの有効/無効を切り替える方のボタン (本書のサンプルにあった <code>mButton</code> に相当する方ですね)、そして <code>button_to_branch</code> が <code>BranchActivity</code> クラスとして定義されたサブのアクティビティに遷移するボタン、ということになります。</p>
<p>さて、このプログラムを実際に実行してみると、サブの方のアクティビティが有効な状態であれば (デフォルトではそうなっているはず)、以下のような画面が表示されます (ちなみに画像はちょうど「次の画面へ」ボタンを押しているところです)。<br />
<div id="attachment_210" style="width: 410px" class="wp-caption aligncenter"><a href="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110925-next-activity-enable-01.png"><img src="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110925-next-activity-enable-01.png" alt="もう一つのアクティビティが有効な状態の時に、そのアクティビティを開こうとしているところ。" title="もう一つのアクティビティが有効な状態の時に、そのアクティビティを開こうとしているところ。" width="400" height="285" class="size-full wp-image-210" /></a><p class="wp-caption-text">もう一つのアクティビティが有効な状態の時に、そのアクティビティを開こうとしているところ。</p></div><br />
ここで「次の画面へ」ボタンを押すと、当然、サブの方のアクティビティの画面に遷移します。<br />
<div id="attachment_211" style="width: 410px" class="wp-caption aligncenter"><a href="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110925-next-activity-enable-02.png"><img src="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110925-next-activity-enable-02.png" alt="もう一つのアクティビティは問題なく開く。" title="もう一つのアクティビティは問題なく開く。" width="400" height="285" class="size-full wp-image-211" /></a><p class="wp-caption-text">もう一つのアクティビティは問題なく開く。</p></div><br />
さて、メインの方の画面に戻って、今度は一回「子のアクティビティを無効にする」ボタンを押して、サブの方のアクティビティを無効にしてから、「次の画面へ」ボタンを押してみることにします。<br />
<div id="attachment_208" style="width: 410px" class="wp-caption aligncenter"><a href="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110925-next-activity-disable-01.png"><img src="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110925-next-activity-disable-01.png" alt="もう一つのアクティビティが無効な状態の時に、そのアクティビティを開こうとしているところ。" title="もう一つのアクティビティが無効な状態の時に、そのアクティビティを開こうとしているところ。" width="400" height="285" class="size-full wp-image-208" /></a><p class="wp-caption-text">もう一つのアクティビティが無効な状態の時に、そのアクティビティを開こうとしているところ。</p></div><br />
…するとどうでしょう、今度は以下の画面のようなエラーを表示して、アプリケーションは終了してしまいました。<br />
<div id="attachment_209" style="width: 410px" class="wp-caption aligncenter"><a href="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110925-next-activity-disable-02.png"><img src="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110925-next-activity-disable-02.png" alt="アクティビティは無効なので開くことができず、エラーを表示してアプリは終了する。" title="アクティビティは無効なので開くことができず、エラーを表示してアプリは終了する。" width="400" height="285" class="size-full wp-image-209" /></a><p class="wp-caption-text">アクティビティは無効なので開くことができず、エラーを表示してアプリは終了する。</p></div><br />
ところでこの画面、前回も同じような画面を見たような気がします。そう、 <code>AndroidManifest.xml</code> ファイル、すなわちマニフェストに登録し忘れたアクティビティを開こうとしたときに表示されたのと同じエラー画面です。</p>
<p>実際、 Debug パースペクティブを開いてデバッグ実行してみると、この画面が表示されるまで進めた段階で、 LogCat に以下のようなログメッセージが出力されます。</p>
<blockquote><p>
09-25 08:48:58.955: ERROR/AndroidRuntime(468): android.content.ActivityNotFoundException: Unable to find explicit activity class {jp.co.harapeko.testsome/jp.co.harapeko.testsome.BranchActivity}; have you declared this activity in your AndroidManifest.xml?
</p></blockquote>
<p>これはまさしく、マニフェストに登録し忘れたアクティビティを開こうとしたときに出力されたのとまったく同じログメッセージです。すなわち、「アクティビティを無効にする」とは、「アクティビティがマニフェストに登録されていないような状態にする」ということなのでした。</p>
<p>そんな訳なので、</p>
<blockquote cite="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X" title="Android Hacks &mdash;プロが教えるテクニック &amp; ツール"><p>
この Hack を利用して、特定の条件を満たした時しか表示されないようなアイコンがある隠し機能があるアプリを作ると面白いかもしれませんね。
</p></blockquote>
<p>といったような使い方をするのであれば、アプリケーションの画面遷移図において隔離されている (その画面に遷移する画面が存在しない) 状態に設計されている必要がある、という注意事項をわきまえなければならないことになります。</p>
<p>例えば、ゲームソフトのコンフィグでゲームのオープニングをスキップできるようにする場合、単純にオープニング用のアクティビティとゲーム本編用のアクティビティとでアイコンを差し替えるように作ろうとすると、ゲーム本編用のアクティビティを無効にした場合にゲーム本編が実行できなくなるという残念な障害にぶち当たるので、ゲーム本編に即座に飛ぶスキップ用のアクティビティを間に挟む必要があるよ、ということになるでしょう。</p>
<p>今回は以上です。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2011/09/25/activity-enable-and-disable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android プログラミング(3) &#8211; Activity 入門</title>
		<link>https://blog.harapeko.jp/2011/09/15/activity-introduction/</link>
		<comments>https://blog.harapeko.jp/2011/09/15/activity-introduction/#comments</comments>
		<pubDate>Thu, 15 Sep 2011 04:48:01 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[活動記録]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=177</guid>
		<description><![CDATA[シリーズとして、下記の書籍にて学習したことについてのメモを綴っています。 Android Hacks &#038;mda [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>シリーズとして、下記の書籍にて学習したことについてのメモを綴っています。</p>
<ul>
<li>
<a href="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X">Android Hacks &mdash;プロが教えるテクニック &amp; ツール<br />
<img border="0" src="http://ws.assoc-amazon.jp/widgets/q?_encoding=UTF8&#038;Format=_SL160_&#038;ASIN=487311456X&#038;MarketPlace=JP&#038;ID=AsinImage&#038;WS=1&#038;tag=harapekoinc-22&#038;ServiceVersion=20070822" /></a>
</li>
</ul>
<p>今回は、「HACK#6 アクティビティ入門」 (p.41～58) の内容について触れていきます。<br />
<span id="more-177"></span><br />
いよいよプログラミングです! 張り切っていってみましょう。</p>
<h3>アクティビティって何だ?</h3>
<blockquote cite="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X" title="Android Hacks &mdash;プロが教えるテクニック &amp; ツール"><p>
<strong>アクティビティ</strong>とは、画面を持った機能の単位を指します。 Android では、アクティビティ毎に状態を管理する仕組みがあり、特殊な場合を除いて画面の遷移もアクティビティ単位で行います。
</p></blockquote>
<p>なるほど。モバイル機器向けの OS と割り切ってか、アプリが画面を占有することが前提の世界観になっているわけですね。 Windows でのアプリ開発がウィンドウ主体で行われたり、 Web アプリのクライアントスクリプト部分の開発が DOM 主体で行われたりするのとはまた対照的です。</p>
<blockquote cite="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X" title="Android Hacks &mdash;プロが教えるテクニック &amp; ツール"><p>
また、この Hack では本書のサンプルコードが利用できます。サンプルコードは <code>trunk/Hack6/HelloActivity</code> にあります。
</p></blockquote>
<p>こんな事が書いてありますが、この本、別に CD とかは付いてきません。いきなりこんなこと書かれちゃうと何の事やらさっぱりで混乱しちゃう読者とか結構いそうな気がするんですが… <tt>(^_^;)</tt></p>
<p>で、その問題のサンプルコードですが、<a href="http://code.google.com/p/android-hacks/" title="android-hacks - Android Hacksのサンプルソースコード - Google Project Hosting">こちらのサイト</a>から入手可能なようです。 Subversion で checkout できるのはいいですね。 git でコピーして改造コードを独自に管理したりするとなお幸せかもしれません。</p>
<p>…ですが、私はここは敢えてこのサンプルコードには手を出さず、本書に書かれたソースコードを手で入力しながら学習してみることにしました。写経は学習の基本です…多分。</p>
<p>さて、それでは本書に習って Eclipse 上で新規プロジェクトを作ってみましょう… おっと、そうだった。新規プロジェクトは、すでに<a href="http://blog.harapeko.jp/2011/09/06/android-hacks-1/" title="はらぺこ日誌? ブログアーカイブ ? Android プログラミング(1) - 開発環境の設定まで">開発環境の設定の際にお試しで作っちゃっていました</a>。今回はこいつをそのまま利用することにします。</p>
<blockquote cite="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X" title="Android Hacks &mdash;プロが教えるテクニック &amp; ツール"><p>
アプリケーションを実行するには図 6-3 のようにプロジェクトツリーでプロジェクトのルートを選択した状態で、再生ボタンの形をしたアイコンをクリックします (Run メニューの Run を選択しても可)。
</p></blockquote>
<p>これ、プロジェクトツリー上での選択は必ずしも必須ではないみたいです…。もしかしたら複数のプロジェクトが存在するようなケースではここでの選択が意味のあるものになるのかもしれませんが、とりあえず何も選択しないままツールバーの再生アイコンをクリックしても全く問題なく起動します。</p>
<p>むしろ、ここでエミュレータが初めて起動する際には、起動直後はエミュレータがロック状態になっていて、そのままではアプリが実行されないので、エミュレータ側でロックを解除してあげる必要があります。ロックを解除してしばらくすると、アプリが実行されるようです。<br />
<div id="attachment_178" style="width: 490px" class="wp-caption aligncenter"><a href="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110910-hello-world.png"><img src="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110910-hello-world.png" alt="新規プロジェクト作成直後の実行画面" title="新規プロジェクト作成直後の実行画面" width="480" height="440" class="size-full wp-image-178" /></a><p class="wp-caption-text">新規プロジェクト作成直後の実行画面</p></div><br />
何も考えずにプロジェクト名を「TestSomething」として作ると、こんな内容の実行画面になります。 Activity の名前はプロジェクト作成時に指定可能…。</p>
<h4>static な文字列管理は strings.xml で</h4>
<p>ところでこの画面に表示されている文字列、いったいどこに書かれているんでしょう? メインアクティビティクラス (私の場合、今回は <code>TestSomethingActivity.java</code>) のソース中にはこんな文字列は存在しませんでした。</p>
<pre>
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
</pre>
<blockquote cite="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X" title="Android Hacks &mdash;プロが教えるテクニック &amp; ツール"><p>
<code>setContentView</code> メソッドで指定している <code>R.layout.main</code> は、自動的に生成される XML の画面レイアウトリソースです。
</p></blockquote>
<p>なるほど。それでは <code>main.xml</code> の内容を覗いてみましょう…。</p>
<pre>
&lt;TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    <strong>android:text="@string/hello"</strong>
    /&gt;
</pre>
<p><code>android:text</code> という属性名があからさまにアヤシイですね! <code>@</code> で始まるのは何かの識別子でしょうか? なんとなく、これは別のリソースを参照しているのではないかという気がします。</p>
<p><code>@string</code> で始まっているので、 <code>string.xml</code> なんてファイルでもあるのかな? と Package Explorer の中を探ってみると… <code>res/values</code> の位置に、まさにそのものずばりのファイル <code>strings.xml</code> を見つけました!<br />
<div id="attachment_179" style="width: 490px" class="wp-caption aligncenter"><a href="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110910-string-xml-1.png"><img src="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110910-string-xml-1.png" alt="新規プロジェクト作成直後の string.xml" title="新規プロジェクト作成直後の strings.xml" width="480" height="350" class="size-full wp-image-179" /></a><p class="wp-caption-text">新規プロジェクト作成直後の strings.xml</p></div><br />
反転部分がまさに表示されていた文字列そのものですね。どうやら当たりのようです。早速書き換えて実行してみましょう!<br />
<div id="attachment_181" style="width: 490px" class="wp-caption aligncenter"><a href="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110910-string-xml-2.png"><img src="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110910-string-xml-2.png" alt="string.xml を弄ってみた" title="strings.xml を弄ってみた" width="480" height="350" class="size-full wp-image-181" /></a><p class="wp-caption-text">strings.xml を弄ってみた</p></div><br />
ここははらぺこらしく…ｗ</p>
<p>ちなみに画面の雰囲気が大分変わってますが、実はここを弄っていた当初、スクリーンショットを撮るのに失敗していたようで、その後、さんざん弄った (Eclipse のフォント設定含めて<tt>^_^;</tt>) 後になって慌てて撮り直したためです… <tt>m(_ _)m</tt></p>
<p>実行すると、以下のように表示されました。日本語も化けていませんね。大成功です <tt>v(^-^)</tt> 。<br />
<div id="attachment_182" style="width: 490px" class="wp-caption aligncenter"><a href="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110910-harahetta.png"><img src="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110910-harahetta.png" alt="strings.xml 変更後の実行画面" title="strings.xml 変更後の実行画面" width="480" height="440" class="size-full wp-image-182" /></a><p class="wp-caption-text">strings.xml 変更後の実行画面</p></div><br />
こうしてみると、なるほどどうやらアプリで使用する static な文字列は、この <code>strings.xml</code> ファイル内にリソースとして記述し、それを参照するように実装するのが良さそうです。決めうち定数をどのようにして一括管理するべきかというのは、開発においては結構重要なポイントですよ。</p>
<h3>アクティビティのライフサイクル</h3>
<p>p.45～48 に渡って、アクティビティの生成、起動、中断、破棄などのライフサイクルと、それに応じて呼ばれるメッセージハンドラメソッドの説明、それらが呼ばれるタイミングを示した図が示されています。</p>
<p>「図6-12 画面が回転した時」とあって、ここの意味がよく分からなかったので調べてみました。実は私は Android 端末はまだ入手していないのでピンと来なかったのですが… (<del>社費で中古の白ロムでも買おうかなぁ…</del>)、どうやら画面を縦横に傾けるとアプリの画面もそれに応じて向きが変わるようになっていて、そのことを言っているようです。画面回転時の再描画を実現するために、一旦アクティビティを破棄して生成し直す、ということをやっていて、その辺の一連のメッセージが全部飛んでくるから適切に対処しなきゃいけない、という話なのでした。</p>
<h3>アクティビティの遷移</h3>
<blockquote cite="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X" title="Android Hacks &mdash;プロが教えるテクニック &amp; ツール"><p>
画面遷移をするために他のアクティビティを起動させます。まずは起動するアクティビティを用意するために、 <code>MainActivity.java</code> をコピーして <code>SubActivity.java</code> を作成します。
</p></blockquote>
<p>これ、もうちょっと上手い方法は無いのでしょうか…? いろいろと実装してコード量が大きくなってしまったファイルをコピーして、不要なコードを削除して書き直す、というのはちょっと面倒です。かといって、単純にクラスを新規作成だと、 <code>extends</code> と、それに必要な <code>import</code> 行ぐらいは出力してくれるものの、それ以外のよく使うライブラリの <code>import</code> 行や <code>onCreate()</code> メソッドなどの冗長なコードを手作業で書き加える必要があるし、この後にまたコピペして作っているレイアウトリソースの XML ファイルも手作業で作らなきゃなりません。 XML ファイルのみを作成するウィザードは一応あるようですが、どうせならアクティビティ作成用のウィザードも ADT にて用意しておいていただきたいものです…。</p>
<blockquote cite="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X" title="Android Hacks &mdash;プロが教えるテクニック &amp; ツール">
<pre>
10:    android:text="Sub activity"
</pre>
</blockquote>
<p>もちろんここは、任意のテキストを指定できます。日本語でも問題ないようです。こんな感じで…ｗ</p>
<pre>
    android:text="飯でも食うか   ((( ´ω｀)=3"
</pre>
<blockquote cite="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X" title="Android Hacks &mdash;プロが教えるテクニック &amp; ツール"><p>
<code>main.xml</code> を以下のように修正します。 (ボタンの使い方は「Hack #9 ボタンを使う」で詳しく紹介しています。ここではおまじないだと思ってそのまま入力してください。)
</p></blockquote>
<p>私自身がそうなのですが、未知の技術を習得しようとする人が、講義の中で本論ではない未知の記述が出てきた時によく使われる「おまじない」という言葉に戸惑ってしまう、ということは少なくないようです。よく分からないものをよく分からないまま、ブラックボックスのままの状態で後回しにされるのが苦手なんですね。そんなわけで、 HACK#9 の該当部分を先回りして読んでみました。内容を要約すると概ね以下の通りです。</p>
<ul>
<li><code>android:id</code> 属性にボタン要素の ID を指定する。 <q><code>@+id/</code>(ID 名)</q> のように書くことによって、 <code>Java</code> コード中から <q><code>R.id.</code>(ID 名)</q> として参照することが出来るようになる。</li>
<li><code>android:layout_width</code> 属性に <code>wrap_content</code> と指定すると、ボタンの表示幅かボタン内のラベル文字列にフィットするようになる。</li>
<li><code>android:text</code> 属性にボタンのラベル文字列を設定する。</li>
</ul>
<p>ここでは特に ID の指定と利用の方法が重要ですね。この予備知識を元に、その後に出てくる Java のサンプルコードを読んでみると、より理解がスムーズに行くのではないかと思います。</p>
<blockquote cite="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X" title="Android Hacks &mdash;プロが教えるテクニック &amp; ツール"><p>
5～8行目の <code>View</code>、<code>Button</code>、<code>OnClickListener</code>、<code>Intent</code> クラスを使うために、 <code>import</code> 文を追加しています。
</p></blockquote>
<p><code>import</code> 行の行数がやたらと多くなってしまう辺りは如何にも Java という感じですね。クラス内クラスはグロブ (<q>(パッケージ)<code>.*</code></q> みたいな書き方) じゃ拾えないですしね。ていうか、クラス内クラスはむしろ名前空間に展開しないでコード中で <q><code>new View.OnClickListener()</code></q> みたいに書かせちゃった方が、むしろセマンティクス的にも閲覧性は上がるような気もします…。</p>
<h4>DDMS って何? LogCat って何?</h4>
<blockquote cite="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X" title="Android Hacks &mdash;プロが教えるテクニック &amp; ツール"><p>
さらにアクティビティを追加したことを <code>AndroidManifest.xml</code> に追記してやる必要があります。追記せずに <code>SubActivity</code> を起動させるとエラーが出てしまいます (図 6-16)。
</p></blockquote>
<p>ほぅほぅ、それは是非とも試しておかなきゃですね! というわけで、<code>AndroidManifest.xml</code> を弄る前にとりあえず実行して、ボタンを押すとエラー画面がでてアプリが終了してしまうのを確認しました。</p>
<p>で、ここまではよかったのですが、その直後。</p>
<blockquote cite="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X" title="Android Hacks &mdash;プロが教えるテクニック &amp; ツール"><p>
DDMS のパースペクティブで LogCat のログを確認すると以下のようなエラーが赤い文字で出ているのがわかります。
</p></blockquote>
<p>さっぱりわかりません。 <strong>DDMS って何? LogCat ってどこで見れるの??</strong></p>
<p>Web の時代に生きていることをこれほど感謝することはありませんね…。ぐぐればその答えはすぐに見つけることが出来ました。</p>
<p>DDMS は Dalvik Debug Monitor Server の略で、 Android には標準で装備されているものらしいです。 ADT プラグインを入れた Eclipse 上では Android SDK アプリのデバッグの際に Android 端末やエミュレータ上の DDMS と通信してデバッグを実現しています。上記の引用では恐らくデバッガそのもののことを DDMS と呼んでいらっさるのでしょう。</p>
<p>デバッガの話なのでデバッグ実行してあげる必要があるのですが、 Eclipse 上でツールバーの虫アイコンをクリックしてデバッグを開始しても、 LogCat とやらは表示されません。デバッグの状況をモニタするには、パースペクティブも Debug のものに切り替えてあげる必要があります。 Eclipse の画面右上の所にある「Debug」ボタンをクリックするか、または [Window] → [Open Perspective] → [Debug] メニューを選択すると、 Debug のパースペクティブに切り替えることができ、めでたく LogCat を拝むことができるようになります。<br />
<div id="attachment_183" style="width: 490px" class="wp-caption aligncenter"><a href="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110912-ddms-logcat-01.png"><img src="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110912-ddms-logcat-01.png" alt="DDMS のパースペクティブで LogCat を確認" title="DDMS のパースペクティブで LogCat を確認" width="480" height="350" class="size-full wp-image-183" /></a><p class="wp-caption-text">DDMS のパースペクティブで LogCat を確認</p></div><br />
しかしこの画面ではログの全文に目を通すことができないので、コピペしてテキストエディタにでも貼りつけましょう。 LogCat にて (これ自体はログを一覧するマルチカラムのリストコントロールになっています)、コピーしたいログを選んで (複数選択できます) [Ctrl + C] キーを押すと、選んだログの全文がクリップボードにコピーされます。なんて直感的! ｗ<br />
<div id="attachment_184" style="width: 490px" class="wp-caption aligncenter"><a href="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110912-ddms-logcat-02.png"><img src="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110912-ddms-logcat-02.png" alt="LogCat のログをテキストエディタにコピペしたところ" title="LogCat のログをテキストエディタにコピペしたところ" width="480" height="385" class="size-full wp-image-184" /></a><p class="wp-caption-text">LogCat のログをテキストエディタにコピペしたところ</p></div><br />
これで、DDMS がはき出したエラーログの全文に目を通すことができるようになりました。うん。確かに、本書に書かれている通りのメッセージが出力されているようですね。</p>
<h4>マニフェストの追記</h4>
<blockquote cite="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X" title="Android Hacks &mdash;プロが教えるテクニック &amp; ツール"><p>
クラスだけを追加して <code>AndroidManifest.xml</code> への追記を忘れることはよくある (筆者だけ?) ので、
</p></blockquote>
<p>いえいえ、多分私もしょっちゅう忘れそうです。しかしリソース XML 然り、クラスの冗長な部分然り、アクティビティの作成に際してはあまりにも多くの部分が冗長な手作業になっていて悩ましいところですね。なんかその辺自動化できるようなプラグインって無いのかなぁ… 自作するか?</p>
<h3>状態の保存、復元</h3>
<p>本書ではここからサンプルコードが変わるのですが、やってる内容的に言ってもこれだけのためにまた一からプロジェクト作り直すのも面倒だったので、これまで使ってきたプロジェクトに、そのままここからの内容を付け足していくことにしてしまいました。</p>
<p>で、思ったのですが、恐らくサンプルコードでは最初から用意してあるものの、本書では触れられていないためにひっそりとおまじない扱いにされている要素がいくつかあることに気づきました。やっぱり学習の基本は写経ですね! というわけでその辺について触れていきましょう。</p>
<h4>追加すべき import 行</h4>
<p>このサンプルプログラムではボタンの他にイメージビューと呼ばれるコントロールを利用しています。その為、以下の <code>import</code> 行を追加してあげる必要があります。</p>
<pre>
import android.widget.ImageView;
</pre>
<p>とはいえ、ボタンも同時に利用しているのですから、このように書くと、実際には以下のような記述になってしまうでしょう。</p>
<pre>
import android.widget.Button;
import android.widget.ImageView;
</pre>
<p>実際の開発ではこの 2つに限らず、 <code>android.widget</code> パッケージに含まれるたくさんのコントロールを同時に使うことになるのではないでしょうか。といったことを考えても、この 2行を、グロブを用いて以下のように 1行にまとめて書くように習慣づけた方が何かと捗るような気がします。</p>
<pre>
import android.widget.*;
</pre>
<p>それからもう一つ、このサンプルプログラムでは、乱数を生成するオブジェクトのクラス <a href="http://download.oracle.com/javase/7/docs/api/java/util/Random.html"><code>Random</code></a> も利用していますので、以下の 1行も加えてあげる必要があります。これもまぁ、このパッケージの配下のクラスはいろいろと利用頻度高いんじゃないの? という配慮の元、グロブで書いちゃってますが、ここではふつーに完全修飾クラス名で書いちゃってもいいのかなとは思います。</p>
<pre>
import java.util.*;
</pre>
<h4>画像リソースを用意する</h4>
<blockquote cite="http://www.amazon.co.jp/gp/product/487311456X/ref=as_li_ss_il?ie=UTF8&amp;tag=harapekoinc-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=487311456X" title="Android Hacks &mdash;プロが教えるテクニック &amp; ツール">
<pre>
05:    int[] images = new int[]{
06:        R.drawable.android, R.drawable.stamp
07:        , R.drawable.stamp2, R.drawable.mail};
</pre>
</blockquote>
<p>Java なんだからカンマの手前で改行とかするなよみたいな野暮なことを言うつもりはないのですがｗ、この <q><code>R.drawable.</code>～</q> で始まる識別子、当然最初から用意されているわけもなく、この識別子によって参照されるリソースを自分で用意してあげる必要があります。</p>
<p>そのリソースとはつまり画像のことです。適当な画像ファイルを 4つばっかし作成し、それぞれ然るべき名前で特定の場所に保存しておいてあげる必要があります。その手順を以下に示します。</p>
<ol>
<li>適当な画像を用意します。画像の形式は JPEG か PNG 辺りが確実でしょう。</li>
<li>画像のファイル名を、先ほどの識別子 <q><code>R.drawable.</code>～</q> の <q>～</q> の部分と同じになるように変更します。例えば、 <code>R.drawable.android</code> に対応するファイル名は <code>android.jpg</code> とか <code>android.png</code> とかになります。</li>
<li>画像ファイルを、 <code>(プロジェクトルート)/res/drawable-hdpi</code> ディレクトリ下にコピーします。</li>
<li>Eclipse 上で [F5] キーを押し、 Package Explorer の表示を更新します。このとき、自動生成される <code>R.java</code> も更新され、先ほどの識別子が有効になります。</li>
</ol>
<h4>変数名を変えて入力してみよう</h4>
<p>正直なところ、<code>mButton</code> とか <code>mImageView</code> とかみたいなハンガリアン記法的な名前規則がなんだか馬鹿みたいで私の性に合わないというのもあったので、メンバフィールドなどの変数名はもうちょっと意味のある名前に変えて入力していました。こうすることで、テキストに書かれているコードをただ書き写すのではなく、どの部分にどの変数を使うべきなのかと言うことをきっちり考えながら入力していくことになるので、理解も早くなるのではないかと思います。<br />
<div id="attachment_185" style="width: 490px" class="wp-caption aligncenter"><a href="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110915-state-demo.png"><img src="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110915-state-demo.png" alt="状態保存のサンプルプログラム実行画面" title="状態保存のサンプルプログラム実行画面" width="480" height="440" class="size-full wp-image-185" /></a><p class="wp-caption-text">状態保存のサンプルプログラム実行画面</p></div><br />
プロジェクトを作り直さずに機能を付け足すような形で実装したため、こんな画面になってしまいましたｗ　ちなみに、 [Ctrl + F12] キーで画面を横向きにすると、画像は画面の大きさに合わせて自動でリサイズされるようです (この辺の動作は <code>AndroidManifest.xml</code> で変更できるのかな?)。</p>
<h3>まとめ</h3>
<p>まだ初歩の初歩だというのにやたらと内容がゴージャスになってしまいました… orz この辺は慣れてきた中盤以降の方がメモも簡潔になっていきそうな予感もありますね。</p>
<p>ここまで文句ばかり書いていましたがｗ、実際にはかなり丁寧に説明が書かれていて、順を追って読みながら試していけば、すんなりと理解できるようになっているのではないかと思います。今後もこんな感じで学習を進めていきたいと思います。</p>
<p>しかし新規アクティビティ作成用のプラグイン欲しいなぁ… あれだけは本当にいただけないよなぁ… 後でまた少し探してみよう…。</p>
<p>今回は以上です。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2011/09/15/activity-introduction/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
