<?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; Android</title>
	<atom:link href="https://blog.harapeko.jp/tag/android/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>
		<item>
		<title>Android プログラミング(2) &#8211; エミュレータ試行錯誤</title>
		<link>https://blog.harapeko.jp/2011/09/10/android-emurator/</link>
		<comments>https://blog.harapeko.jp/2011/09/10/android-emurator/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 17:02:42 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[活動記録]]></category>
		<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=168</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#4 エミュレータ入門」および「HACK#5 エミュレータ Hacks」(p.23~41) の内容について触れていきます。<br />
<span id="more-168"></span></p>
<h3>AVD の作成</h3>
<p>当面はコマンドラインからの作成が役に立ちそうなケースが思い浮かばなかったので、とりあえず AVD Manager にて作成する方法のみ押さえました。</p>
<p>作成の際に操作するダイアログの内容は、あとで AVD を編集するときに用いるダイアログとほとんど変わらないようです。つまり、ここで指定する内容は後で変更が可能である、かのように見えるのですが、実際に後で OS のバージョンや skin の大きさを変えたりすると、起動できなくなっちゃって、設定を戻しても起動できなくなっちゃって、結局 AVD イメージを捨てる羽目になった、ということがあったので、注意が必要そうです…。</p>
<p>もっとも、 AVD を捨てて作り直すのにそれほど時間は掛からないので、その辺は気軽に割り切ってやっちゃっても良さそうですが…。</p>
<p>SD Card は指定した容量とモロに同じ大きさのイメージファイルを作ってしまうので、テストに応じた最小限の容量に抑えるべきですね。ていうか圧縮ぐらいしてくれ…。</p>
<p>作成の際に設定項目「Snapshot」というのがあります。本書には説明がありませんでした。これはエミュレータの状態をスナップショットとして保存し、次回起動時に利用するという機能のようです (<a href="http://www.hlplus.jp/php/blog/index.php?UID=1302009298" title="AVDの高速起動化 for Android Snapshot">こちらのサイト</a>が参考になりました…)。ただ、実際使ってみたのですが、私の環境では終了に時間がかかる割には起動が速くなるイメージがなかったので、それほどありがたみを感じていません…。</p>
<h3>エミュレータを起動</h3>
<p>これも AVD Manager からの起動のみ押さえました。 Eclipse からの起動は、とりあえず何か作ってみてからでいいかなぁと…。</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>
…また、キーボードショートカットの詳細については「Android デベロッパーズガイド」を参照してください。
</p></blockquote>
<p><strong>何という丸投げ</strong>… <tt>(-_-;</tt></p>
<p>とりあえず<a href="http://developer.android.com/guide/developing/devices/emulator.html#controlling" title="Using the Android Emulator | Android Developers">この辺</a>を眺めておけばよさげです…。</p>
<h3>SD カード</h3>
<p>AVD 作成時か起動時の話なので、 AVD Manager で設定できる以上、特に知ることもないかなと…。この後のエミュレータコンソールから SD カードの着脱が出来ると面白いんですが、そもそも Android の仕様的に電源が入った状態で SD カードを着脱するっていうことはあり得ないのかな…。</p>
<h3>ネットワーク構成</h3>
<p>ここは何かしらのアプリを作ったときでないと役に立たない情報なので、出来るよ、ということを知っておくにとどめて読み飛ばしました。</p>
<h3>DNS 設定、プロキシ設定</h3>
<p>この辺も予備知識程度ですね。</p>
<h3>エミュレータコンソール</h3>
<p>勢い勇んで <a href="http://sourceforge.jp/projects/ttssh2/">Tera Term</a> とか入れてみたんですが、何故か繋がらなかった… 結局いつも使ってる <a href="http://yebisuya.dip.jp/Software/PuTTY/">PuTTY ごった煮版</a>で接続。何故か最初のコマンドは必ず失敗するんですが、それ以外は特に問題なく使えます。</p>
<p>Cygwin の telnet でも ok でした。そもそも日本語は通じないっぽいので、横幅 80桁固定が嫌じゃなければ Cygwin でも全く問題無さそうです。</p>
<h3>ポートリダイレクト</h3>
<p>これも予備知識ですね。読んでて一瞬 <a href="http://www.gnu.org/s/gdb/">GDB</a> って何だっけとか思ってしまった辺りに自分の経験値の低さを実感せざるを得ません… orz</p>
<h3>位置情報の設定</h3>
<p>これ、試してみたかったのですが、 <code>geo</code> コマンド発行後に、エミュレータ上の Web ブラウザで Google プレースに接続し、現在位置を認識しようとすると、何故かエミュレータ内で core dump してしまうようです…。自作アプリとかならうまく値が取れるようになるんでしょうか…?</p>
<h3>ハードウェアイベント</h3>
<p>テキストエディタで大量に <code>event send</code> コマンドを書きまくって、それをコンソール上で一気にコピペしてあげたりすると、オートパイロット的に動かせてなかなか便利です。タッチパネル操作もこれでできるんであれば、こいつで結合テストの自動テスト化は概ね完結できそうですね。</p>
<p>但し、私の環境では重い処理になる上に Windows 自体がブルーバックを起こしやすいため、非常にリスキーな処理になってしまいますが… orz</p>
<h3>テキストを一気に…</h3>
<p><code>event text</code> コマンドでテキストを一気に入力できる、とあるのですが、私の環境だと (PuTTY でも Cygwin telnet でも) 確実にエミュレータがアプリケーションエラーを起こして強制終了してしまいます (エミュレータ内で core dump ではなくて、エミュレータ自体がこける) …。</p>
<p>ちなみに、ヘルプを見ると「メッセージは UTF-8 じゃないと駄目だよ」みたいなことが書いてあったので、 UTF-8 であれば日本語もいけるのかと PuTTY 経由で試してみたのですが、この場合今度は強制終了すらせずにハングアップして (応答がないままうんともすんとも言わない状態になって) しまいます…。はっきり言って使い物になりません orz</p>
<h3>電源状態を制御</h3>
<p><code>power status</code> コマンドは、 <code>not-charging</code> の他に、 <code>unknown</code>, <code>charging</code>, <code>discharging</code>, <code>full</code> が指定できます。それぞれ、不明 (電池アイコンが「?」になる)、充電中、充電してない、充電完了、と動作します (<code>discharging</code> と <code>not-charging</code> の違いがよく分かりませんが…)。</p>
<p>充電されている量は <code>power capacity (百分率)</code> で指定できるようですね。残り電池容量に応じて動作を切り替えるようなアプリを作った際には役に立ちそうです。</p>
<h3>ネットワーク状態、遅延・スピード設定</h3>
<p><code>network speed full</code> したときの <code>network status</code> の結果が <code>0 bits/s</code> って表示されるのはいかがなものかと…</p>
<p>遅いスピードや遅延を設定すると、その分ちゃんと Web アクセスが重くなる辺りは、よくできてるなぁと思います。</p>
<h3>電話の状態</h3>
<p><code>gsm</code> コマンドで、架空の電話番号から電話が掛かってきたり切られたり保留されたりするのをシミュレートできます。アプリ実行中に電話が掛かってきた、みたいなテストをしたいときに有効ですね。</p>
<h3>コンソールから SMS</h3>
<p>日本語は入力できるんですが、おもいっきり文字化けします…。</p>
<h3>エミュレータの大きさ</h3>
<p>エミュレータを実行中に大きさを変えられるのは有意義ではあるんですが、それを出来るようにするんだったらそもそもエミュレータウィンドウ自体のリサイズをマウス操作でできるようにしておいてよと突っ込みたくなるのは私だけでしょうか…。</p>
<h3>スキン変更</h3>
<p>そんなおしゃれ必要なの? とか思ってたらどうやら画面サイズのことだったようでなんとも… AVD Manager で AVD イメージ作成時に指定するものなのでここもスルーですね。</p>
<h3>エミュレータ間通信</h3>
<p>ポートリダイレクトを利用してエミュレータ間で通信できるよ、というお話でした。そもそも独自の通信機能を持ったアプリを作った時じゃないと役に立たないお話です。予備知識として押さえておくにとどめましょう。</p>
<h3>エミュレータ間で電話やSMS</h3>
<p>電話は特に問題ないのですが…<br />
<div id="attachment_172" style="width: 1034px" class="wp-caption aligncenter"><a href="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110909-emu-sms.png"><img src="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110909-emu-sms.png" alt="エミュレータ間で SMS" title="エミュレータ間で SMS" width="640" height="480" class="size-full wp-image-172" /></a><p class="wp-caption-text">エミュレータ間で SMS</p></div><br />
やっぱり日本語は文字化けしてしまうようです orz</p>
<p>この辺、ロケールを日本語に設定しても改善されないので、エミュレータの仕様だと思って諦めるしか無さそうです… ていうか実機では実際ちゃんと動いてるのかなぁ…。</p>
<p>今回は以上です。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2011/09/10/android-emurator/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Android プログラミング(1) &#8211; 開発環境の設定まで</title>
		<link>https://blog.harapeko.jp/2011/09/06/android-hacks-1/</link>
		<comments>https://blog.harapeko.jp/2011/09/06/android-hacks-1/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 10:02:12 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[活動記録]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Eclipse]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=162</guid>
		<description><![CDATA[スマートフォン向けアプリケーション事業に参入すべく、 Android SDK による開発について調査しています [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>スマートフォン向けアプリケーション事業に参入すべく、 Android SDK による開発について調査しています。</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>当ブログではシリーズとして、上記書籍を参考に学習しながら、気づいた点などについてメモを残していくことにします。</p>
<p>今回は、開発環境の導入と設定までです。<br />
<span id="more-162"></span></p>
<h3>「1章 Android 入門 Hacks」について</h3>
<p>Android に関する簡単な紹介として、過去の歩み、 Android マーケット、 <a href="http://www.oesf.jp/">OESF</a> について触れています。それから日本語アプリをいくつか紹介。次に SDK のバージョンについて触れ、バージョン毎のシェアの推移がグラフでまとめられています。</p>
<p>日本の会社が書いた書籍だけあって、日本の事情が加味された紹介になっていますが、予備知識としてもさらっと流しておけばよさげです…。お急ぎの方は読み飛ばしちゃってもいいかもしれません。</p>
<p>OESF の認定資格とか、取りたがる人いるのかなぁ…。</p>
<h3>開発環境の設定</h3>
<p>というわけで、「2章 初級アプリケーション Hacks」からがいよいよ実践になります。先ずは開発環境の導入です。</p>
<p>まず予備知識ですが、 Android SDK を用いて普通に開発するのであれば、開発言語は基本的には Java になります (フレームワークを使って JavaScript+HTML5 で開発とかも出来るらしいですが本書では多分触れられていません)。また、 IDE に Eclipse を (Google が配布している ADT プラグインとセットで) 使用することが推奨されているようです。</p>
<p>つまり、導入すべき基本構成は以下の通りとなります (導入順)。</p>
<ol>
<li><a href="http://developer.android.com/sdk/index.html">Android SDK</a></li>
<li><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">JDK</a></li>
<li><a href="http://www.eclipse.org/">Eclipse</a></li>
<li>Android SDK の各種コンポーネント</li>
<li>ADT (Android Development Tools) プラグイン</li>
</ol>
<p>以下、導入順にメモを残します。</p>
<h4>1. Android SDK</h4>
<p><a href="http://developer.android.com/sdk/index.html" title="Android SDK | Android Developers">ここ</a>にある書庫ファイルをダウンロードして、ローカルディスク上に展開します。場所はどこでもいいみたいですが、当面 Windows XP を使用する私はとりあえず <code>C:\</code> の直下に展開しました。</p>
<h4>2. JDK</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>
Windows で JDK 5、もしくは JDK 6 が入っていない場合はインストールしてください。これは Eclipse の動作に必要です。どちらも入っていない場合は JDK 6 をインストールしてください。
</p></blockquote>
<p>本書発行時には存在していなかった JDK 7 がリリースされていたので、それをインストールしちゃいました。後で動かしてみて駄目だったら入れ直します…。多分大丈夫だと思うんですけどね。</p>
<h4>3. Eclipse</h4>
<p>用途別なのか何なのか、<a href="http://www.eclipse.org/downloads/" title="Eclipse Downloads">とてつもなくいろんな種類のバージョンが存在</a>していて激しく戸惑うのですが、本書にはその中からどれを選べと言うことは特に書かれていません。多分ここはあんまり考えても仕方ないところだと思うので、素直に「Eclipse Classic 3.7」というのを選んでダウンロードし、インストールしました。 Eclipse 自体は優れた IDE なのだと思うので、他の用途でも試してみたいところなのですが (C++ とか C++ とか C++ とか)、その為のプラグインは後からでも必要に応じて入れてあげればいいでしょう。</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>
Android SDK 2.2 リリース時点で Eclipse 3.4 か 3.5 を使うことができます。この章では Eclipse 3.5 で解説を進めます。
</p></blockquote>
<p>stable なバージョンを入れた方が後々いろいろとありがたいと思うので、あまり考えずに新しいのを入れればいいと思います。</p>
<p># Linux ではまだ試してないのですが、まともなディストリビューションを使っていてパッケージ管理ツールから導入が出来るんであればその方がいいかもしれません。</p>
<p>こちらも単に書庫ファイルを展開してあげればいいだけです。 Windows の場合は <code>%ProgramFiles%</code> の配下に入れてあげたくなるところですが、 Vista や 7 をお使いの方は十分注意してください。私は持って無いので試せません、あしからず… <tt>m(_ _)m</tt></p>
<h4>4. Android SDK の各種コンポーネント</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; ツール">
<ol>
<li type="1" value="1">
コマンドラインから <code>&lt;SDK ルートディレクトリ&gt;/tools</code> にある <code>android</code> を起動、もしくは Eclipse で [Window] → [Android SDK and ADV Manager] を選択します。
</li>
</ol>
</blockquote>
<p>この「Eclipse で～」という説明は嘘です。なぜなら、この後にインストールする ADT プラグインが入っていなければこのメニューは出現しませんし、先に ADT プラグインだけをインストールしても、 Android SDK が見つからない、というようなエラーが出てきて何も出来ないからです。</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; ツール">
<ol>
<li type="1" value="1">
<code>&lt;SDK ルートディレクトリ&gt;/SDK Setup.exe</code> を実行します。
</li>
</ol>
</blockquote>
<p>このプログラムのファイル名は、現在では <code>SDK Manager.exe</code> に変更されています。</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>
すべてのコンポーネントを選択してダウンロードすると非常に時間がかかります。
</p></blockquote>
<p>私はこの大切な 1行を見落としたまま、勢いすべてのコンポーネントをダウンロードしに行ってしまいました。他に用事があったのでその間に済めばと思ったのですが、半日潰れてしまう上に、途中で通信上の問題が発生したりするとハングアップ (動きが止まったまま先に進まない) してしまったりするので、お勧めしません…。</p>
<p>開発ターゲットとなるプラットフォームのバージョンを選んで、それ用の Android コンポーネントと Google APIs コンポーネントを入れれば、とりあえずは十分っぽいです。サードパーティのコンポーネントについては、特に贔屓にするような事情があるわけでもないならば、後回しでよさげです。</p>
<p># ちなみに、巷で出回っている Android 2.3 というのは、 2.3.1 と 2.3.3 のどちらなのでしょう…??</p>
<h4>5. ADT プラグイン</h4>
<p>概ね本書の説明通りでインストールできました。「Finish」ボタンを押した後、なにやら警告ダイアログが表示されましたが、「Continue」を押しておけば良さそうです。</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; ツール">
<ol>
<li type="1" value="3">
図 3-2 のように各項目を設定します。
</li>
</ol>
</blockquote>
<p>馬鹿みたいにコンポーネントを全部入れてしまったおかげで、やたらと縦に長いダイアログになってしまいました <tt>(^_^;</tt> 。</p>
<div id="attachment_163" style="width: 510px" class="wp-caption aligncenter"><img src="http://blog.harapeko.jp/wp-content/uploads/2011/09/fig-20110906-new-android-project.png" alt="新規プロジェクト作成時のダイアログ" title="新規プロジェクト作成時のダイアログ" width="500" height="1044" class="size-full wp-image-163" /><p class="wp-caption-text">新規プロジェクト作成時のダイアログ</p></div>
<p>ここで「Finish」を押すと、どうやらプロジェクトは作られるようなのですが、特に画面の表示は変化しません。 Eclipse は使い慣れていないので微妙に戸惑いましたが、 [Window] → [Open Perspective] → [Java Browsing] を選んであげれば、プロジェクトのソースファイルにアクセスできるようです。</p>
<p>本日はここまで。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2011/09/06/android-hacks-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
