アプリ終了

とある画面で例えばボタンをタップしたときにアプリを終了させたいとします。
(ホームでアプリアイコンをタップすると最初から起動する。)
アプリ終了の実装方法は以下の通り。

●起動Activity
AndroidManifestではlaunchModeは何も記載しない

●別Activity
Intent intent = new Intent(this, 起動Activity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra(“APP_EXIT_FLAG”, true);
startActivity(intent);

●起動Activity
@Override
protected void onNewIntent(final Intent intent) {
boolean appExitFlag = getIntent().getBooleanExtra(“APP_EXIT_FLAG”, false);
if (appExitFlag) {
finish();
}
}

スティッキーインテント

スティッキーインテントというインテントを最近知ったのですが、スティッキーインテントとはインテントをシステムの中に保存しておいて、後から取り出せるインテントのことです。

(編集中・・・・)

インテントフィルタ(IntentFilter)とは

インテントフィルタ(IntentFilter)とは、アクティビティやサービスが取り扱うことができるインテントを定めるものです。そのアプリケーションのアクティビティ、サービス、ブロードキャストレシーバーは、全てのIntentではなく、定めたインテントにのみを取り扱うように定義します。(=インテントフィルタ)

では、実際そのアプリケーションが取り扱うインテントのみを指定する場合、どようなことを指定してフィルタをかけられるのでしょうか。それは以下の通りです。

アクティビティ、サービス、ブロードキャストレシーバーの….

・アクション
・カテゴリ
・データ(URI)

をフィルタとして指定します。

インテントフィルタはプログラムで動的に定義することも可能ですが、そういったシーンが無い場合はAndroidManifest.xmlに定義した方が、後々このアプリケーションがどういったインテントを取り扱うことができるかを確認する場合、便利かと思います。以下にインテントフィルタの記述例を紹介します。

<activity android:name=”.TestActivity”>
<intent-filter>
<action android:name=”android.intent.action.SEND” />
<category android:name=”android.intent.category.DEFAULT” />
<data android:mimeType=”image/jpeg” />
</intent-filter>
</activity>

上記はアプリケーション内のTestActivityがアクションが「android.intent.action.SEND」で、カテゴリが「android.intent.category.DEFAULT」で、データがjpegのインテントが発行されたときにそのインテントを扱えることを示しています。

追記:

テキストを共有する場合は
Androidmanifestで            <intent-filter>
<action android:name=”android.intent.action.SEND” />
<category android:name=”android.intent.category.DEFAULT” />
<data android:mimeType=”text/plain” />
</intent-filter>
を追加する。

起動ActivityのonCreateでは
if (getIntent().getAction() == Intent.ACTION_SEND) {
CharSequence uri = getIntent().getExtras().getCharSequence(Intent.EXTRA_TEXT);
if (uri != null) {
newMemoDto.memoNote = uri.toString();
}
}

 

 

インテントを使用して別のアプリを起動する

その他インテント使用例
・参考URL
http://d.aoikujira.com/blog/index.php?Android%E3%81%AEIntent%E3%81%A7%E4%BB%96%E3%82%A2%E3%83%97%E3%83%AA%E3%81%A8%E3%81%AE%E9%80%A3%E6%90%BA%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB

●地図起動(Google Maps)

Uri mapUri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, mapUri);
startActivity(intent);

●経路検索

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setClassName(“com.google.android.apps.maps”,”com.google.android.maps.MapsActivity”);
intent.setData(Uri.parse(“http://maps.google.com/maps?myl=saddr&daddr=&dirflg=d&#8221;));
startActivity(intent);

●メール起動

Uri uri =Uri.parse(“mailto:xxx@example.com”);
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(it);

●複数の宛先へメール

Intent it=new Intent(Intent.ACTION_SEND);
String[] tos={“me@abc.com”};
String[]ccs={“you@abc.com”};
it.putExtra(Intent.EXTRA_EMAIL, tos);
it.putExtra(Intent.EXTRA_CC, ccs);
it.putExtra(Intent.EXTRA_TEXT, “Theemail body text”);
it.putExtra(Intent.EXTRA_SUBJECT, “Theemail subject text”);
it.setType(“message/rfc822″);
startActivity(Intent.createChooser(it,”Choose Email Client”));

●添付ファイルをつけてメール起動

Intent it = newIntent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_SUBJECT, “Theemail subject text”);
it.putExtra(Intent.EXTRA_STREAM,”file:///sdcard/mysong.mp3″);
sendIntent.setType(“audio/mp3″);
startActivity(Intent.createChooser(it,”Choose Email Client”));

●MP3の再生

Intent it = new Intent(Intent.ACTION_VIEW);
Uri uri =Uri.parse(“file:///sdcard/song.mp3″);
it.setDataAndType(uri,”audio/mp3”);
startActivity(it);

●APKファイルのアンインストール

Uri uri =Uri.fromParts(“package”, strPackageName, null);
Intent it = newIntent(Intent.ACTION_DELETE, uri);
startActivity(it);

●APKファイルのインストール

Uri installUri = Uri.fromParts(“package”,”xxx”, null);
returnIt = newIntent(Intent.ACTION_PACKAGE_ADDED, installUri);

●ギャラリーから写真を選択

Intent i = new Intent();
i.setType(“image/*”);
i.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(i, 11);

Intent(インテント)とは

Androidアプリの開発をやっていて、なんとなーく理解しているIntentについて、ちゃんと理解しないといけないなぁと思い、もう一度、調べてみました。

●Intentとは

どのコンポーネント(Activity、Service、ContentProvider、BroadcastReceiver)を起動するかという選択を「Intent」という仕組みで実装している。
よくある使い方としては、あるActivityから別のActivityを起動するときです。

Intentとは簡単にいうと、「どのコンポーネント起動時するかを指定する(もしくは、Androidシステムに委ねて、依頼する)もの」ということになるのでしょうか。
“Androidシステムに委ねて、依頼する”というのは暗黙的Intent発行で行います。次で述べます。

●明示的Intentと暗黙的Intent

よくある使い方として”あるActivityから別のActivityを起動する”と述べましたが、これが「明示的Intentの発行」と呼ばれるものです。これは、起動する目的のコンポーネントが予めわかっていて、そのコンポーネントを直接指定してIntentを発行し利用する方法です。

(例)
——————————-
Intent intent = new Intent(getApplicationContext(), NextActivity.class);//インテントの作成
startActivity(intent);    //次画面を表示
——————————-

インテントの種類として、もう1つあります。それが「暗黙的Intentの発行」です。
暗黙的Intentは、明示的Intentとは違い、起動するコンポーネントを明示的に指定しません。
条件を指定して暗黙的Intentを発行すると、その条件に合うコンポーネントが無いかをシステムに問合せ、探して起動してくれます。もし、条件に合うコンポーネントが複数見つかった場合には、画面にダイアログを表示して、ユーザーに起動するコンポーネントを選択させる仕組みになっています。
例えば、地図を表示させたい場合は、「ユーザーにデータを表示させたい(ACTION_VIEW)」と「どんなデータ(地図の場所)」を指定することで地図コンポーネントが起動します。

(例)
——————————-
Intent intent=new Intent(“android.intent.action.VIEW”,
Uri.parse(“geo:0,0?q=Tokyo”));
startActivity(intent);
——————————-

暗黙的Intentの発行は、”条件に合うコンポーネントをシステムに問合せ、探して起動してくれる”と述べましたが、では何を元にして探しているのかという疑問が出てきます。
これについて調べてみたところ、探す元となる情報源はAndroidシステムに登録されている「コンポーネント情報」だそうです。コンポーネント情報については、Androidシステムに既に登録されているコンポーネントもありますが、Androidアプリケーションのインストール時に登録されたものもあります。アンドロイドマーケットなどから、インストールしたアプリケーションがそれに当たります。アプリのインストールする際に、実はコンポーネント情報が登録されているのです。次にそのコンポーネント情報の中身についてみていきたいと思います。

●コンポーネント情報の中身

アプリAの情報
(※インストール時に、情報はAndroidシステムに登録されている。)
——————————-
1.Activity1
<情報>
・ACTION_VIEW(ユーザーに表示できる)
・CATEGORY_BROWSABLE(ブラウザから起動できる)
・CATEGORY_TAB(タブの中身になることができる)
・jp.co.test.editor/xxxxx.xxx(このMimeTypeのデータを扱える)

2.Activity2
<情報>
なし

3.Service1
<情報>
なし
——————————-

ブラウザアプリのWEBページのリンクをクリックした時に、知らないデータ形式(jp.co.test.editor/xxxxx.xxx)があった場合、このデータを開けるアプリはないかIntentを発行します。
そうすると、AndroidシステムがアプリAの情報が合致するので、アプリAを起動するという流れになります。

コンポーネント情報はAndroidManifest.xmlの<activity>タグの中の<intent-filter>タグで指定しますが、その他にも明示的にAndroidシステムに登録するというやり方もあります。

AndroidManifest.xmlでコンポーネント情報を指定する方法では、<activity>タグの中の<intent-filter>タグで特定のアクションやカテゴリを指定してフィルタを設定します。
指定する情報の種類はいろいろありますので、確認してみてください。
指定する情報は有効となるAPIレベルがあるので、対応しているかを確認してから指定してください。
http://developer.android.com/reference/android/content/Intent.html