branch10480’s blog

Topics that I've learned.

AndroidのActivity概要

アクティビティのコンセプト

1 つのアプリが別のアプリを呼び出すとき、呼び出し元のアプリは、別のアプリ全体をひとまとめとして呼び出すのではなく、その中のアクティビティを呼び出します。そうすることで、アクティビティが、アプリがユーザーとやり取りする際のエントリ ポイントとして機能します。

iOSアプリではアプリを呼び出すときはアプリをまるごと呼び出して、その中で分岐させる必要がありますが、Androidはもともとその仕組を持っているのですね。

一般に、1 つのアクティビティがアプリ内の 1 つの画面を実装 アクティビティ同士が連携してアプリ内にまとまりのあるユーザー エクスペリエンスを形成しますが、各アクティビティは他のアクティビティと緩やかに結びついているだけです。アプリ内のアクティビティ間に依存関係はほとんどありません。

iOSの ViewController に近い。

アクティビティをアプリで使用するには、アプリのマニフェストにその情報を登録する必要があります。

アクティビティを用意しただけでは動かないということですね。

マニフェストの設定

ここからはまとめていきます。

...

アプリで アクティビティを使用可能にするには、Manifest で アクティビティと Property を宣言する必要がある。

<application> 要素の子として <activity> 要素を追加。

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

必須の属性は アクティビティのクラス名指定を行う android:name のみ。

注意!

アプリを公開したあとでアクティビティ名を変更しないこと!変更するとアプリのショートカットなど一分機能が無効化される。詳細は こちら

インテントフィルタ を宣言する

Androidプラットフォームの非常に強力な機能!

明示的なリクエスト暗黙的なリクエスト に対応した起動処理が行える。

<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>

↑の例ではテキストデータを送信するアクティビティを設定し、そのためのリクエストを他のアクティビティから受信する方法を示している。

<action> 要素が必須で、 <category><data> の両方もしくは一方を指定する必要がある。

↑の例の場合、 <action> 要素でデータ送信することを表し、 <category> 要素を DEFAULT として宣言するとアクティビティが開始リクエストを受信できるようになる。(暗黙的なインテントはデフォルトで DEFAULT カテゴリとして認識される。)

<data> はアクティビティが送信できるデータ種類を指定する。

より詳しい説明は こちら を参照。

■ 呼び出し例

val sendIntent = Intent().apply {
    action = Intent.ACTION_SEND
    type = "text/plain"
    putExtra(Intent.EXTRA_TEXT, textMessage)
}
startActivity(sendIntent)

パーミッションを宣言する

<activity> タグのプロパティとして android:permission を指定して特定のアクティビティ起動できるアプリを制限できる。

<manifest>
<activity android:name="...."
   android:permission="com.google.socialapp.permission.SHARE_POST" />

呼び出し側のアプリにも <uses-permission> タグを指定する。

親と子のアクティビティは同じ <uses-permission> を指定しないと子が呼び出されないので注意。

<manifest>
    <uses-permission android:name="com.google.socialapp.permission.SHARE_POST" />
</manifest>

参考文献

アクティビティの概要
インテント フィルタを追加する