【Android Developers Training】28.ユーザーを別のアプリケーションに導く

12202 ワード

この文章はGoogleの公式Android Developers Trainingの文書から訳して、翻訳者の技術は普通で、Androidが好きなため翻訳の考えを生んで、全く個人の興味の趣味です.
リンク:http://developer.android.com/training/basics/intents/sending.html
Androidの最も重要な特性は、アプリケーションがユーザーを別のアプリケーションに導くことができる能力であり、これはアプリケーションが期待するパフォーマンスの「アクション」に基づいている.例えば、地図上の住所を表示したいアプリケーションがあるなら、地図を表示するActivityをあなたのアプリケーションで構築する必要はありません.Intentを使ってアドレスを確認する必要があります.その後、Androidシステムは自動的に地図上に住所を表示できるアプリケーションを起動します.
1時間目の授業でBuiding Your Firstアプリ(ブログリンク:http://www.cnblogs.com/jdneo/p/3438954.html)というように、あなたはintenstsを使ってあなたのアプリケーションのActivity間で変換しなければなりません.一般的にintentを表示することによって、このことを行うと、起動したいコンポーネントの類名が示されます.しかし、他のアプリケーションを通じて「地図を見る」などの行動を実行したい場合は、隠しタイプのintentを使用しなければなりません.
この授業はどのように特定の行為のために暗黙的なintentを作成するかを示します.また、他のアプリケーションのActivityを使ってこの行為を実行します.
 
一)隠蔽的なIntentを構築する.
暗黙的なIntentは、コンポーネントのクラス名を開始するということではなく、実行すべき行動を宣言します.行動は、閲覧、編集、送信、またはいくつかのものを取得するなど、あなたがやりたいことを指定します.Intenstsもこの行動に関するデータをよく含んでいます.例えば、あなたが見たい住所や、あなたが送ってほしいメールの内容などです.あなたが望むなら、intentを作成してもいいです.データはゆりでもいいし、他のデータタイプでもいいです.もちろん、intentはデータを必要としなくてもいいです.
あなたのデータがゆりであるならば、動作とデータを定義するためにIntent()の構築関数を使用してもいいです.
次の例は、ゆりデータを用いて電話番号を指定してintentを作成する方法であり、電話行動を初期化する.
Uri number = Uri.parse("tel:5551234");

Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
あなたのアプリケーションがstartActivity()を呼び出すことによってこのintentを実行すると、ダイヤルアップアプリケーションは所定の電話番号に従ってコールを初期化する.
以下は他のいくつかのintentの例であり、それらが対応する挙動およびゆりデータペアである.
  • ブラウズ地図:
  • // Map point based on address
    
    Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
    
    // Or map point based on latitude/longitude
    
    // Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level
    
    Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
  • ページを閲覧する:
  • Uri webpage = Uri.parse("http://www.android.com");
    
    Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
    他のタイプの暗黙的なIntetsは、文字列などの異なるデータタイプを提供するために「extra」データを必要とする.一つ以上の「extra」データを異なるput Extra()方法で追加します.
    デフォルトでは、システムは、intentに含まれるゆりデータに基づいて、必要な適切なMIMEタイプを指定する.もしあなたがintentにゆりを含まないなら、setType()を使用してintentに関連するデータタイプを指定するべきです.MIMEタイプを設定するとさらにどのタイプのActivityがこのintentを受け入れますか?
    以下はいくつかのintentの例であり、それらは追加のデータを追加することによって所望の挙動を定義する.
  • 添付のメールを送ります.
  • Intent emailIntent = new Intent(Intent.ACTION_SEND);
    
    // The intent does not have a URI, so declare the "text/plain" MIME type
    
    emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
    
    emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"[email protected]"}); // recipients
    
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject");
    
    emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text");
    
    emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"));
    
    // You can also attach multiple items by passing an ArrayList of Uris
  • カレンダーイベントを作成します.
  • Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
    
    Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30);
    
    Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30);
    
    calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
    
    calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
    
    calendarIntent.putExtra(Events.TITLE, "Ninja class");
    
    calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");
    ノート:
    このカレンダーイベントのIntentは、API Level 14またはより高いプラットフォームでのみサポートされている.
    ノート:
    あなたのIntent定義を明確にすればするほどいいです.例えば、ACTION_VIEWのintentを使って一つの画像を展示したいなら、MIMEタイプを「イメージ/*」と特定してください.これは、このintentによって他のデータタイプを見ることができるアプリケーション(例えば地図閲覧器)が活性化されることを防止する.
     
    二)このIntentを受け入れるアプリケーションがあることを確認する.
    Androidプラットフォームは、あるIntentが内蔵されたアプリケーションによって処理されることを保証していますが、電話、電子メール、またはカレンダーなどのアプリケーションがアクティブになる前に確認のステップを含みます.
    Caution:
    もしあなたがアクティブになったら、デバイスの中に何のアプリケーションもなく、このトランザクションを処理できるintentが存在しないと、あなたのアプリケーションは崩壊します.
    このintentに正しく応答できるアプリケーションがあることを確認するために、queryIntentActivities()を呼び出して、Intentを処理できるactivityリストを取得する.Listが空に戻ってきたら、このintentを安全に使えます.たとえば:
    PackageManager packageManager = getPackageManager();
    
    List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
    
    boolean isIntentSafe = activities.size() > 0;
    isIntent Safeが本当なら、少なくとも一つのアプリケーションがこのintentに正確に対応できるということです.うそなら、このintentを扱うアプリケーションがないということです.
    ノート:
    この検査はあなたのアプリケーションが最初に起動した時に行うべきです.このようにするとintentの機能特性を無効にして、ユーザーが試してそれを使うことを防ぐことができます.特定のアプリケーションがこのintentを処理できると知っているなら、このアプリケーションをユーザにダウンロードさせるためにリンクを提供してもいいです.
     
    三)Intentを通じてActivityを起動する.
    link to your product on Google Playを作成し、追加の情報を設定すると、Intentを呼び出してシステムに送信することができます.このintentを処理できるacity以上のシステムが発見された場合、図1に示すように、どのアプリケーションを起動するかをユーザに選択させるダイアログが表示されます.このintentを処理できるアプリケーションが一つだけあれば、すぐにシステムが起動します.
    startActivity(intent);
    図1.複数のアプリケーションが処理できる場合、システムに表示される選択ダイアログ
    以下は完全な例です.どのように地図を閲覧するためにintentを作成するかを示しています.そしてアプリケーションがあるかどうか確認してから、それを起動します.
    // Build the intent
    
    Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
    
    Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
    
    
    
    // Verify it resolves
    
    PackageManager packageManager = getPackageManager();
    
    List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
    
    boolean isIntentSafe = activities.size() > 0;
    
    
    
    // Start an activity if it's safe
    
    if (isIntentSafe) {
    
        startActivity(mapIntent);
    
    }
     
    四)アプリケーションセレクタを表示します.
    あなたのstartActivity()Intentに渡してActivityを起動させると、複数のアプリケーションがこのintentに正しく応答できる場合、ユーザはデフォルトでどのプログラムを使用するかを選択することができます.ユーザが毎回同じアプリケーションを使用してトランザクションを処理したい場合(例えば、ウェブページを開くと、ユーザはブラウザ一つだけを好むか、写真一つを撮ると、ユーザはカメラ一つだけを使用している可能性がある)、この時はいいです.
    しかし、このintent挙動が複数のアプリケーションによって処理される場合、ユーザは、それぞれ異なるアプリケーション、例えば「共有」という行為を使用することを期待することができ、ユーザは、複数のアプリケーションが、ある項目を共有することができるかもしれない.このとき、図2に示すように、選択アプリケーションのダイアログが明示的に表示されます.このダイアログは、ユーザにこの操作を実行するたびに、トランザクションを処理するために自分の望むアプリケーションを選択するように強制します.
    図2.アプリケーション選択ダイアログ
    セレクタを表示するために、startActivity()を使用してintentを作成し、createChooser()に渡す.
    Intent intent = new Intent(Intent.ACTION_SEND);
    
    ...
    
    
    
    // Always use string resources for UI text.
    
    // This says something like "Share this photo with"
    
    String title = getResources().getString(R.string.chooser_title);
    
    // Create and start the chooser
    
    Intent chooser = Intent.createChooser(intent, title);
    
    startActivity(chooser);
    これにより、startActivity()に伝達されるintentを処理できるアプリケーションリストが表示され、ダイアログのタイトルはコードに指定されたテキストである.