Может кто-нибудь объяснить мне основную функцию Intents в ОС Android?
Я новичок в программировании приложений для ОС Android. Что касается общей архитектуры ОС, я понимаю, что процессы реализуются как процессы Linux и что каждый из них изолирован.
Однако я совершенно запутался в используемых IPCs и syscalls (если таковые имеются). Я знаю, что IBinder-это форма этого; посылки отправляются туда и обратно между процессами, а связки-это массивные формы посылок (?). Но даже это мне незнакомо. То же самое и с намерениями. В общем, я... не понимаю, какие виды IPCs реализуются и как.
Не мог бы кто-нибудь кратко объяснить мне конкретные методы, используемые приложениями пользовательского уровня в ОС Android для связи друг с другом и ОС? Я занимался программированием ядра и играл с различными IPCs в Linux (Ubuntu и Debian), поэтому было бы очень полезно, если бы все это было объяснено в отношении того, с чем я знаком...
Заранее спасибо!
2 ответа:
Android-это сервис-ориентированная архитектура, которая означает, что все приложения на устройстве состоят из компонентов, которые запрашивают работу, выполняемую другими компонентами, используя сообщения высокого уровня , называемые Intents. В то время как за кулисами намерений, что span приложения отправляются с помощью Binder, который полагается на специальный Android вкус общей памяти, цель для разработчиков приложений, чтобы быть блаженно не знают о реализации. Только требования то есть, когда компонент хочет передать объект вместе со своим" намерением " запросить работу у другого компонента, который живет в другом процессе, этот объект должен быть parcelable (думаю, сериализуемым). Кроме того, чтобы приложения могли использовать намерения других приложений, эти намерения должны быть опубликованы в файле манифеста с использованием фильтра намерений .
Приложение, которое хочет вызвать отображение веб-страницы, будет иметь код, который выглядит следующим образом: это:
public class OpenInternet extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ((Button) findViewById(R.id.OpenInternetButton)) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(Intent.ACTION_VIEW, Uri .parse("http://www.google.com")); startActivity(i); } }); } }
Другое приложение, способное обслуживать это намерение, отображая веб-страницу, определит в своем манифесте следующие фильтры намерений, чтобы перехватить намерение, отправленное другим приложением:
<!-- For these schemes were not particular MIME type has been supplied, we are a good candidate. --> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="http" /> <data android:scheme="https" /> <data android:scheme="about" /> <data android:scheme="javascript" /> </intent-filter> <!-- For these schemes where any of these particular MIME types have been supplied, we are a good candidate. --> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" /> <data android:scheme="https" /> <data android:scheme="inline" /> <data android:mimeType="text/html"/> <data android:mimeType="text/plain"/> <data android:mimeType="application/xhtml+xml"/> <data android:mimeType="application/vnd.wap.xhtml+xml"/> </intent-filter>
Помимо использования Intents, вы можете создавать объекты с прокси-объектами с помощьюAIDL , которые позволяют выполнятьудаленные вызовы процедур через границу процесса.
Вам, вероятно, не нужно беспокоиться о том, как libc выполнение системных вызовов, так как вы работаете внутри виртуальной машины и удалены от нее на несколько уровней. Что касается" нормального " IPC, у вас есть сокеты, но у вас Нет общей памяти System V, поскольку это было сочтено проблематичным и удалено.
В своей самой основной форме намерение-это набор данных, который отправляется экземпляру указанного объекта, чтобы он мог взять его и выполнить с ним какое-либо действие. Например, у вас может быть URL-адрес, полученный из RSS-канала, и вы хотите открыть его в браузере, который может находиться или не находиться внутри вашего приложения. Вы создадите намерение, включая целевой объект (действие), который вы хотите получить, и некоторые данные, которые вы хотите отправить этому объекту. Объекты могут иметь получателей, которые принимают намерения и регистрируются таким образом, что если вы создадите намерение сказать, откройте url-адрес с помощью браузера, Android распознает, что ваше "намерение" заключается в использовании объекта веб-браузера. Поскольку вы передаете вместе с ним URL-адрес, то браузерное приложение может подобрать его и что-то с ним сделать. Намерения очень гибки и могут быть очень специфичными сообщениями, поэтому вы можете отправить намерение конкретному объекту с указанным именем компонента, или вы можете оставить это и просто добавить категорию и Android предложит пользователю выбрать все объекты, которые говорят, что они являются объектами этой категории (например, "веб-браузеры"), и сообщение будет отправлено на любой объект (опять же, на самом деле просто действие), выбранный пользователем.
Итак, вкратце, у вас есть:
- MyActivity1 читает RSS-канал.
- MyActivity1 создает намерение, указывая имя компонента com.очень страшно.MyWebBrowserActivity и данные о "http://www.stackoverflow.com
- MyWebBrowserActivity имеет приемник для получения намерения и отображает переданный URL-адрес
Для отличного руководства по намерениям, просто найдите минутку, чтобы прочитать это, оно того стоит:
Android руководство разработчика: намерения и намерения фильтров