Может кто-нибудь объяснить мне основную функцию Intents в ОС Android?


Я новичок в программировании приложений для ОС Android. Что касается общей архитектуры ОС, я понимаю, что процессы реализуются как процессы Linux и что каждый из них изолирован.

Однако я совершенно запутался в используемых IPCs и syscalls (если таковые имеются). Я знаю, что IBinder-это форма этого; посылки отправляются туда и обратно между процессами, а связки-это массивные формы посылок (?). Но даже это мне незнакомо. То же самое и с намерениями. В общем, я... не понимаю, какие виды IPCs реализуются и как.

Не мог бы кто-нибудь кратко объяснить мне конкретные методы, используемые приложениями пользовательского уровня в ОС Android для связи друг с другом и ОС? Я занимался программированием ядра и играл с различными IPCs в Linux (Ubuntu и Debian), поэтому было бы очень полезно, если бы все это было объяснено в отношении того, с чем я знаком...

Заранее спасибо!

2 3

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 руководство разработчика: намерения и намерения фильтров