AndroidアプリケーションとAndroidが共有ボタンと共有メカニズムをどのように実装するのかと思っていました。たとえば、YouTubeの共有ボタンを押すと、共有するアプリのリストがポップアップ表示されます。このリストはどのように決定されますか?特定の「共有」インテントはありますか?次に、インテントエクストラで提供されているタイプのインテントを共有できるすべてのスポットが表示されますか?これを実装するために使用される設計パターンの技術名は何ですか?ありがとう。
AndroidアプリケーションとAndroidが共有ボタンと共有メカニズムをどのように実装するのかと思っていました。たとえば、YouTubeの共有ボタンを押すと、共有するアプリのリストがポップアップ表示されます。このリストはどのように決定されますか?特定の「共有」インテントはありますか?次に、インテントエクストラで提供されているタイプのインテントを共有できるすべてのスポットが表示されますか?これを実装するために使用される設計パターンの技術名は何ですか?ありがとう。
回答:
これには2つの部分があります。通信アプリが物事を共有できると言うメカニズムと、アプリがコンテンツを共有できるメカニズムです。一度に1つずつ扱いますが、最初にインテントについて簡単に説明します。
Android のインテントは、アプリの起動に使用されるものです。ショートカットのように、またはWindowsファイルの関連付けのように機能します。インテントは、起動するアプリの名前を指定できますが、必須ではありません。また、実行するアクション(「メインアクティビティを開く」、「このURLを表示する」、「カレンダーエントリを作成する」など)と、アクションの対象となるオブジェクトのMIMEタイプ(たとえば、表示したいもの)を指定することもできます。タイプはimage / jpegです)。アクションの名前には、特定のアプリに固有のものもありますが、多くのアプリはAndroidによって標準化されており、アプリの相互作用を可能にしています。
各アプリは、実行できるアクションの種類を示すインテントフィルターを指定します。たとえば、画像ビューアアプリは、MIMEタイプが「image / *」である「このURLを表示する」ためのインテントフィルタを登録します。Webブラウザーは、URLスキームが「http」または「https」である「このURLを表示する」ためのインテントフィルターを登録します。物事を共有できるようにするために、アプリは「送信」インテントのインテントフィルターを特定のタイプ(例:写真のみを共有できる場合)または任意のタイプで登録します。
一部のコンテンツを共有するアプリは、「共有」アクションと共有するコンテンツを指すURLを使用してインテントを作成します。(これは、多くの場合、コンテンツアプリのプライベートストレージ内のファイル、またはコンテンツアプリによって生成されたストリームへの一時的なアクセスを受信アプリに与える「一時的な」URLです。)を処理するアプリの名前を指定していません。意図。次に、その意図をAndroidフレームワークに与え、Androidに選択ダイアログを表示するように要求します。Androidは、インテントをすべてのインストール済みアプリのインテントフィルターと比較し、リストを作成してユーザーに表示します。ユーザーが特定のアプリを選択すると、Androidはそのアプリを起動してインテントを渡します。アプリはURLを使用して、元のアプリからコンテンツを取得します。
マシュマロには、直接共有と呼ばれる別のメカニズムがあります。これはインテントメカニズムを補完するものであり、「だれに送信しますか」という追加のステップをスキップして、選択ダイアログから直接共有するユーザーまたはグループを選択できます。これは少し異なります。通信アプリはサービスを提供する必要があります。コンテンツを含むアプリがセレクターを要求すると、Androidは関連する各アプリのサービスを開始します。サービスは関連する共有ターゲットのリストを返し、Androidはそれらすべての個別のリストをダイアログに表示されるリストにまとめます。
私はManifest
開発者ではないので、私は生の説明をすることができます:アプリは、彼らが理解し、共有アクションで応答する意思があるMimetypeを宣言します。このために、いわゆる「インテントフィルター」を定義します。例:
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="application/*" />
<data android:mimeType="audio/*" />
<data android:mimeType="image/*" />
<data android:mimeType="message/*" />
<data android:mimeType="multipart/*" />
<data android:mimeType="text/*" />
<data android:mimeType="video/*" />
</intent-filter>
そのため、「共有」ボタンを押すたびに、共有するコンテンツが評価され、フォーマットを受け取る意欲を宣言したアプリと照合されます。
ソース: