Может кто-нибудь объяснить, пожалуйста, основные функции Intents в ОС Android? - PullRequest
3 голосов
/ 28 мая 2010

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 28 мая 2010

Android - это Сервис-ориентированная архитектура , что означает, что все приложения на устройстве состоят из компонентов, которые запрашивают работу, выполняемую другими компонентами, используя сообщения высокого уровня, называемые Intents, Несмотря на то, что за кулисами Intents, которые охватывают приложения, отправляются с использованием 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 , так как она была сочтена проблемной и удалена.

1 голос
/ 28 мая 2010

В своей основной форме намерение - это набор данных, который отправляется экземпляру указанного объекта, чтобы он мог взять его и выполнить с ним какое-либо действие. Например, у вас может быть URL-адрес, полученный из RSS-канала, и вы хотите открыть его в браузере, который может быть или не быть внутри вашего приложения. Вы должны создать намерение, в том числе, какой целевой объект (действие) вы хотите получить свое намерение и некоторые данные, которые вы хотите отправить этому объекту. У объектов могут быть приемники, которые принимают намерения и регистрируются так, что если вы создадите намерение сказать, откройте URL с помощью браузера, Android обнаружит, что ваше «намерение» - использовать объект веб-браузера. Так как вы передаете вместе с ним URL-адрес, приложение браузера может его найти и что-то с ним сделать. Интенты очень гибкие и могут быть очень конкретными сообщениями, так что вы можете отправить намерение определенному объекту с указанным ComponentName, или вы можете оставить это и просто добавить категорию, и Android предложит пользователю указать все объекты которые говорят, что они являются объектами этой категории (например, «Веб-браузеры»), и сообщение будет отправлено любому объекту (опять же, просто Activity), который выбрал пользователь.

Итак, вкратце, у вас есть:

  • MyActivity1 читает канал RSS.
  • MyActivity1 создает намерение, указав ComponentName com.superawesome.MyWebBrowserActivity и Data "http://www.stackoverflow.com
  • MyWebBrowserActivity имеет приемник для определения цели и отображает переданный URL

Для хорошего руководства по намерениям, просто найдите минутку, чтобы прочитать это, оно того стоит:

Android Dev Guide: Фильтры содержания и намерений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...