プログラミングのブログ

個人的な技術メモや制作物について書く

Android開発メモ1

Android システムへの理解が足りないので、Developper's guide の主要トピックを読んでいる。英語なのでメモを残しておく。以下、

developer.android.com

の内容を読んで解釈したもの。コードはここからの引用

 

Activity の話

Android アプリが起動されるとシステムは、中心となる Activity を起動する。システムがこの Activity の様々な callback を起動し、アプリは動作する。実質、エントリーポイントがクラス化したようなもの。Activity は1つのウィンドウと対応し、このウィンドウのスクリーンにUI を描画したりする。

Android アプリが起動される環境は、ChromeOS とか、Android TV とか様々なモバイルデバイスで実行されるので、それに対応して表示を変えたりする必要がある。それにサポートするパラダイムのために、このような仕組みになっている。

Activity は、一つのアプリに一つだけではなく、複数のアクティビティを遷移しながら表示やタスクを切り替えて実行する。Activity 同士で情報のやり取りをしたりするには、Intent filter という仕組みを使う必要がある。これによって、Activity 同士が緩く結合され、複数の仕事が混ざりあうのを避けていると思う。この Intent filter は、Unix とかのパイプ&フィルタパターンのようなものか?

 

Activity の使用

Activity はシステムが作るため、manifest に使用する Activity と属性を宣言する必要がある

<manifest ... >
 
<application ... >
     
<activity android:name=".ExampleActivity" />
      ...
 
</application ... >
  ...
</manifest >

のような感じ。ExampleActivity が作成する Activity のクラスとなる。

 

Intent filter について

Intent filter は Activity からシステムへの要求をするための仕組みっぽい。Activity はシステムが作るから、今の Activity から他の Activity に移動する際に、システムへ指定した Activity をスタートするための仕組みが必要となる。そういった要求をシステムへ出すためにあるようだ。

この Activity からシステムへの要求は、明示的要求と暗示的要求と2種類ある。

  • 現在の Activity がシステムへ、特定の Activity へ仕事を要求する場合。E-mail を送るための自作の Activity を指定してスタートさせるような場合
  • 現在の Activity がシステムへ、だれでもいいから特定の仕事を実行できる Activity をスタートさせてほしいと要求する場合。E-mail を送るためにシステムへ、この要求を出した場合、システムは、この要求を実行できる Activity (例えば、G-mail アプリ)を実行させるような場合

そうすると、Activity は、要求を送る、要求を受け取ることができることを、manifest に記述する必要がある。

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
   
<intent-filter>
       
<action android:name="android.intent.action.SEND" />
       
<category android:name="android.intent.category.DEFAULT" />
       
<data android:mimeType="text/plain" />
   
</intent-filter>
</activity>

 

もとの記事のコードをコピペしたもの。<intent-filter>要素を宣言して、intent-filter を使うことを宣言している。<action>要素の属性で、この Activity が何かを送るという要求をシステムへ出すと言っている、たぶん。<category>ようその属性で、どんな Activity がこの Activity に intent を送り、起動されるかを記述、たぶん。デフォルトになっている。<data>要素で、どんな要素を送るか、この場合プレーンテクストを送ることを言っている。

>||

// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent
.setAction(Intent.ACTION_SEND);
sendIntent
.setType("text/plain");
sendIntent
.putExtra(Intent.EXTRA_TEXT, textMessage);
// Start the activity
startActivity
(sendIntent);

||<

実際に intent を使って他の Activity に string を送って Activity を起動していること。Intent が何かということがわかると、なにしているのかよくわかる。システムへプレーンテクストを送るように言っている。この場合、Intent に TheActivity.class のようにクラスを指定していないので、暗黙の要求だと思う。

 

Activity のパーミッション

Activity を呼び出すためにはパーミッションが同じに設定されていないといけないらしい。子Activity から親 Activity を呼び出したらループしそうだし。