Bagaimana aplikasi Android menerapkan tombol berbagi?

11

Saya bertanya-tanya bagaimana aplikasi Android dan Android mengimplementasikan tombol berbagi dan mekanisme berbagi. Misalnya, ketika saya menekan tombol bagikan di YouTube, daftar dari aplikasi untuk dibagikan akan muncul. Bagaimana daftar ini ditentukan? Apakah ada maksud "bagikan" tertentu, dan kemudian semua tempat yang mampu membagikan jenis niat yang disediakan dalam ekstra maksud muncul? Apa nama teknis dari pola desain yang digunakan untuk mengimplementasikan ini? Terima kasih.

Jack Maddington
sumber
1
Apakah Anda benar-benar bermaksud "kotoran", atau apakah itu kesalahan ketik untuk "muncul"? Dalam bahasa Inggris Amerika setidaknya, yang pertama adalah apa yang bayi lakukan untuk popok mereka.
JDługosz
Kamu benar. Baru-baru ini saya beralih ke keyboard Swype di Android yang memungkinkan saya mengetik lebih cepat, tetapi kadang-kadang kata itu salah dan tidak saya perhatikan. Belum yakin apa yang harus dilakukan tentang itu, saya bukan orang yang sangat berhati-hati. Terkadang di dalam sub dan bahkan tidak bisa melihat layar dengan benar.
Jack Maddington
Di kapal selam (kapal selam?)! Apa yang harus dilakukan: mengoreksi sebelum mengirimkan. Dan jangan mencemari daftar prediksi Anda dengan kata-kata yang memalukan.
JDługosz
Secara kebetulan daftar prediksi saya diisi dengan hal-hal dari email lama, yang dibaca Swype secara otomatis. Astaga!
Jack Maddington

Jawaban:

10

Ada dua bagian untuk ini: mekanisme untuk aplikasi komunikasi untuk mengatakan mereka dapat berbagi hal-hal, dan mekanisme untuk aplikasi dengan konten untuk dibagikan. Saya akan berurusan dengan mereka satu per satu, tetapi pertama-tama catatan singkat tentang niat .

Maksud

The niat di Android adalah apa yang digunakan untuk memulai sebuah aplikasi. Ini bisa berfungsi seperti pintasan, atau seperti asosiasi file Windows. Maksudnya dapat menentukan nama aplikasi untuk memulai, tetapi tidak harus. Itu juga dapat menentukan tindakan yang akan dilakukan (mis. "Buka aktivitas utama Anda", "lihat URL ini", "buat entri kalender") dan jenis objek MIME yang akan ditindaklanjuti (mis. Benda yang ingin Anda lihat memiliki tipe image / jpeg). Beberapa nama tindakan khusus untuk aplikasi tertentu, tetapi banyak yang distandarisasi oleh Android untuk memungkinkan aplikasi berinteraksi.

Filter maksud dan aplikasi komunikasi

Setiap aplikasi menentukan filter maksud untuk mengatakan tindakan apa yang dapat dilakukan. misalnya aplikasi penampil gambar akan mendaftarkan filter maksud untuk "lihat URL ini" di mana jenis MIME adalah "gambar / *"; browser web akan mendaftarkan filter maksud untuk "lihat URL ini" di mana skema URL adalah "http" atau "https". Agar dapat berbagi sesuatu, aplikasi mendaftarkan filter maksud untuk maksud "kirim", baik dengan jenis tertentu (misalnya jika hanya dapat berbagi foto), atau untuk jenis apa pun.

Aplikasi konten

Aplikasi yang ingin berbagi beberapa konten menciptakan maksud dengan tindakan "berbagi" dan URL yang menunjuk ke konten untuk dibagikan. (Ini sering merupakan URL "sementara" yang memberikan akses sementara aplikasi penerima ke file di penyimpanan pribadi aplikasi konten, atau ke aliran yang dihasilkan oleh aplikasi konten.) Itu tidak menentukan nama aplikasi untuk menangani maksud. Kemudian, itu memberikan maksud itu ke kerangka Android dan meminta Android untuk menampilkan dialog pemilih . Android membandingkan maksud dengan filter maksud dari semua aplikasi yang diinstal, dan membuat daftar dan menunjukkannya kepada pengguna. Ketika pengguna memilih aplikasi tertentu, Android memulai aplikasi itu dan memberikannya maksud. Aplikasi menggunakan URL untuk mendapatkan konten dari aplikasi asli.

Baru di Marshmallow: Berbagi Langsung

Di Marshmallow, ada mekanisme lain yang disebut Direct Share . Ini melengkapi mekanisme niat sehingga Anda dapat memilih orang atau grup untuk dibagikan langsung dari dialog pemilih, melewatkan langkah ekstra "kepada siapa Anda ingin mengirimkannya". Ini bekerja sedikit berbeda: aplikasi komunikasi harus menyediakan layanan. Ketika aplikasi dengan konten meminta pemilih, Android memulai layanan untuk setiap aplikasi yang relevan. Layanan mengembalikan daftar target berbagi yang relevan , dan Android mengumpulkan semua daftar yang terpisah ke dalam daftar yang ditampilkan dalam dialog.

Dan Hulme
sumber
Tapi, saya telah melihat aplikasi menampilkan beberapa dialog pemilih yang berbeda . Apakah semuanya benar-benar ditampilkan oleh OS, atau dapatkah aplikasi itu sendiri mendapatkan daftar target?
user1686
@grawity Dialog bawaan memiliki beberapa opsi penyesuaian (misalnya untuk mengatur judul), tetapi juga memungkinkan bagi aplikasi untuk meminta Android untuk daftar target berbagi dan memasukkannya ke dalam dialognya sendiri. Pemilih browser saya BURLy adalah contohnya, tetapi dengan maksud "URL terbuka" alih-alih maksud "kirim".
Dan Hulme
11

Saya bukan dev, jadi saya hanya bisa memberikan penjelasan mentah: aplikasi menyatakan ManifestMimetypes mana yang mereka pahami dan bersedia tanggapi dengan aksi berbagi. Untuk ini mereka mendefinisikan apa yang disebut "filter maksud", misalnya:

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

Jadi, setiap kali Anda menekan tombol "bagikan", konten untuk dibagikan dievaluasi dan dicocokkan dengan aplikasi yang telah menyatakan kesediaan mereka untuk menerima format.

Sumber:

Izzy
sumber
1
Cukup banyak langsung. Aplikasi (melakukan berbagi) itu sendiri dapat memfilter beberapa responden maksud, tetapi sebagian besar tidak.
coteyr
2
@HiltonShumway itu sebabnya saya membenarkan jawabannya. Selain saya, Dan cocok dalam pengembangan dan tahu jauh lebih baik bagaimana hal-hal berjalan bersama. Jadi ketika saya memposting jawaban saya, saya berharap dia akan memposting juga - dia tidak mengecewakan harapan saya :)
Izzy