Статьи

Что такое Android Intents?

Интенты — фундаментальная тема для разработчиков Android. Невозможно создавать приложения для Android, не вступая в контакт с намерениями. В этом уроке я расскажу вам о намерениях от А до Я.

В футбольном матче товарищи по команде пропускают мяч по полю с целью отправить его в ворота соперника. Мяч передается от вратаря команды их защитникам. Затем он находит путь к полузащитникам, и, если все работает как запланировано, один из нападающих отправляет его в ворота соперника. Это при условии, что вратарь другой стороны не смог его удержать!

В Android возможность отправлять сообщения стала возможной благодаря объекту Intent . С помощью намерений компоненты Android могут запрашивать функциональность у других компонентов Android. Когда вы открываете приложение Instagram на своем телефоне и используете его для съемки, вы только что использовали намерение. Интенты также помогают общаться между частями приложения; движение от одного экрана (действия) к другому стало возможным благодаря намерениям.

Посмотрите на это так: все компоненты (приложения и экраны) устройства Android изолированы. Единственный способ общения друг с другом — через намерения.

Как упоминалось ранее, вы можете использовать намерения для запуска различных компонентов: действий, служб и широковещательных приемников.

Чтобы начать действие, вы будете использовать метод startActivity (intent) .

Вот фрагмент кода, который демонстрирует, как начать другое действие с намерения.

1
2
3
Intent numbersIntent = new Intent(MainActivity.this, NumbersActivity.class);
 
 startActivity(numbersIntent);

Сначала мы создаем новый объект Intent и передаем ему класс NumbersActivity . Затем мы начинаем новую деятельность, используя это намерение.

Android поддерживает два типа намерений: явное и неявное. Когда приложение определяет свой целевой компонент в намерении, это явное намерение. Когда приложение не называет целевой компонент, это неявное намерение.

Фрагмент кода выше является примером явного намерения. Посмотрите на это снова.

1
2
3
Intent numbersIntent = new Intent(MainActivity.this, NumbersActivity.class);
 
 startActivity(numbersIntent);

Здесь NumbersActivity является целевым компонентом нашей MainActivity . Это означает, что NumbersActivity — это определенный компонент, который будет вызываться системой Android. Важно отметить (как в примере выше), что явные намерения обычно используются в приложении, потому что это дает разработчику максимальный контроль над тем, какой класс будет запущен.

Вот неявное намерение:

1
2
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(«http://www.tutsplus.com»));
 startActivity(intent);

Если у вас есть код выше в вашей кодовой базе, ваше приложение может запускать компонент браузера для определенного URL через намерение. Но как система Android идентифицирует компоненты, которые могут реагировать на определенные намерения?

Компонент может быть зарегистрирован через фильтр намерений для определенного действия. Фильтры намерений могут быть зарегистрированы для компонентов статически в AndroidManifest.xml , Вот пример, который регистрирует компонент как средство просмотра веб-страниц:

1
2
3
4
5
6
7
8
<activity android:name=».BrowserActivity»
          android:label=»@string/app_name»>
  <intent-filter>
     <action android:name=»android.intent.action.VIEW» />
     <category android:name=»android.intent.category.DEFAULT» />
     <data android:scheme=»http»/>
  </intent-filter>
</activity>

Давайте напишем некоторый код, чтобы увидеть, как это работает. В этом разделе вы создадите крошечное приложение, чтобы опробовать оба стиля намерений. Приложение будет иметь небольшую форму для ввода имени и фамилии. При нажатии кнопки « Отправить» оба введенных значения будут переданы другому действию. Также будет кнопка для запуска браузера по вашему выбору. Выбранный браузер откроет https://code.tutsplus.com .

Откройте Android Studio и MainActivity свой MainActivity . Вы можете установить имя пакета в com.tutsplus.code.android.droidintent .

Ваша MainActivity начнется с некоторого импорта и объявления класса:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
package com.tutsplus.code.android.droidintent;
 
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
 
public class MainActivity extends AppCompatActivity {
 
 
}

Затем вы переопределите метод onCreate() чтобы инициализировать активность с любым сохраненным состоянием и макетом активности (мы создадим это позже).

1
2
3
4
5
6
7
8
@Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
 
   // button handlers go here
 
 }

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
final Button submitButton = (Button) findViewById(R.id.submit_button);
 
   submitButton.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
       EditText firstName = (EditText) findViewById(R.id.first_name_text);
       EditText lastName = (EditText) findViewById(R.id.last_name_text);
 
       String firstNameString = firstName.getText().toString();
       String lastNameString = lastName.getText().toString();
 
       Intent submitIntent = new Intent(MainActivity.this, ShowActivity.class);
       submitIntent.putExtra(«firstNameString», firstNameString);
       submitIntent.putExtra(«lastNameString», lastNameString);
       startActivity(submitIntent);
     }
   });

Для кнопки Submit вы устанавливаете OnClickListener для запуска действия при каждом нажатии кнопки. Когда происходит щелчок, мы берем имя и фамилию из представления и отправляем их в следующее действие: ShowActivity . Целевой компонент явно определен в намерении, что делает его примером явного намерения.

01
02
03
04
05
06
07
08
09
10
final Button browserButton = (Button) findViewById(R.id.browser_button);
 
   browserButton.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
 
       Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(«https://code.tutsplus.com»));
       startActivity(intent);
     }
   });

Для кнопки браузера OnClickListener создаст новое намерение запустить любое приложение, которое соответствует фильтру: ACTION_VIEW который должен обрабатывать веб-URL. Другими словами, он запускает веб-браузер. Если на вашем устройстве установлено более одного приложения браузера, вам будет предложено выбрать одно, чтобы выполнить действие по открытию веб-сайта. Это пример неявного намерения.

Макет для MainActivity будет очень простым для целей этого урока.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?xml version=»1.0″ encoding=»utf-8″?>
<LinearLayout xmlns:android=»http://schemas.android.com/apk/res/android»
    xmlns:app=»http://schemas.android.com/apk/res-auto»
    xmlns:tools=»http://schemas.android.com/tools»
    android:layout_width=»match_parent»
    android:orientation=»vertical»
    android:layout_margin=»16dp»
    android:layout_height=»match_parent»
    tools:context=»com.tutsplus.code.android.droidintent.MainActivity»>
 
    <TextView
        android:id=»@+id/first_name_view»
        android:layout_width=»wrap_content»
        android:layout_height=»wrap_content»
        android:text=»Enter first name» />
 
    <EditText
        android:id=»@+id/first_name_text»
        android:padding=»8dp»
        android:layout_width=»200dp»
        android:layout_height=»wrap_content» />
 
    <TextView
        android:id=»@+id/last_name_view»
        android:layout_width=»wrap_content»
        android:layout_height=»wrap_content»
        android:text=»Enter last name» />
 
    <EditText
        android:id=»@+id/last_name_text»
        android:layout_height=»wrap_content»
        android:layout_width=»200dp»
        android:padding=»8dp» />
 
    <Button
        android:id=»@+id/submit_button»
        android:layout_width=»wrap_content»
        android:layout_height=»wrap_content»
        android:text=»Submit»/>
 
    <Button
        android:id=»@+id/browser_button»
        android:layout_width=»wrap_content»
        android:layout_height=»wrap_content»
        android:layout_marginTop=»50dp»
        android:layout_marginLeft=»100dp»
        android:text=»Open Browser»/>
 
</LinearLayout>

Здесь у вас есть два TextView и два EditText указывающие имя и фамилию соответственно. Также есть кнопка для отправки имен и еще одна для запуска браузера.

Чтобы завершить наше приложение, нам нужно создать действие для обработки явного намерения, определенного выше. Создайте новое действие под названием ShowActivity . Это действие, в котором будет показан результат ввода имени и фамилии. Вот как это должно выглядеть:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.tutsplus.code.android.droidintent;
 
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
 
public class ShowActivity extends AppCompatActivity {
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_show);
 
    Bundle extras = getIntent().getExtras();
    String inputFirstName = extras.getString(«firstNameString»);
    String inputLastName = extras.getString(«lastNameString»);
 
    TextView showFirstName = (TextView) findViewById(R.id.show_first_name);
    TextView showLastName = (TextView) findViewById(R.id.show_last_name);
 
    showFirstName.setText(inputFirstName);
    showLastName.setText(inputLastName);
  }
}

В этом упражнении вы начинаете с получения строк, переданных из MainActivity . Вы можете получить ссылку на намерение, которое инициировало запуск этого действия, с помощью функции getIntent() . Затем вы можете получить доступ к строкам, которые были ему переданы, используя getExtras().getString() . Наконец, после получения экземпляров TextView из макета вы отображаете полученные значения.

Схема для этого действия проста:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version=»1.0″ encoding=»utf-8″?>
<LinearLayout xmlns:android=»http://schemas.android.com/apk/res/android»
    xmlns:app=»http://schemas.android.com/apk/res-auto»
    xmlns:tools=»http://schemas.android.com/tools»
    android:layout_width=»match_parent»
    android:layout_height=»match_parent»
    android:layout_margin=»16dp»
    android:orientation=»vertical»
    tools:context=»com.tutsplus.code.android.droidintent.ShowActivity»>
 
    <TextView
        android:layout_width=»wrap_content»
        android:layout_height=»wrap_content»
        android:text=»First Name:»/>
 
    <TextView
        android:id=»@+id/show_first_name»
        android:layout_width=»wrap_content»
        android:layout_height=»wrap_content» />
 
    <TextView
        android:layout_width=»wrap_content»
        android:layout_height=»wrap_content»
        android:text=»Last Name:»/>
 
    <TextView
        android:id=»@+id/show_last_name»
        android:layout_width=»wrap_content»
        android:layout_height=»wrap_content» />
 
</LinearLayout>

Теперь вы можете создать свое приложение и опробовать его на своем Android-устройстве!

Вы также можете использовать пакеты при передаче данных через намерения.

Класс Bundle позволяет хранить сложные данные и поддерживает такие типы данных, как строки, символы, логические, целые и т. Д. Вот пример того, как часть MainActivity.java будет выглядеть, если вы используете Bundle .

01
02
03
04
05
06
07
08
09
10
11
12
13
// Creating Bundle object
Bundle b = new Bundle();
 
// Storing data into bundle
b.putString(«firstNameString», firstNameString);
b.putString(«lastNameString», lastNameString);
 
// Creating Intent object
Intent submitIntent = new Intent(MainActivity.this, ShowActivity.class);
 
// Storing bundle object into intent
submitIntent.putExtra(b);
startActivity(submitIntent);

В этом уроке мы получили краткое введение в использование намерений для создания действий в Android. Мы рассмотрели разницу между явными и неявными намерениями и написали простой пример, в котором использовался каждый тип.

Вы можете прочитать больше о намерениях в документации Android . Понимание того, как они работают, очень важно. По мере того, как вы создаете больше приложений, вы столкнетесь с множеством различных видов интентов и способов их использования.

А пока, посмотрите другие наши посты о разработке приложений для Android!

  • Android SDK
    Введение в компоненты архитектуры Android
    Жестяная мегали
  • Джава
    Шаблоны дизайна Android: шаблон наблюдателя
    Чике Мгбемена
  • Android
    Android с нуля: создание вашего первого приложения для Android
    Джанлука Сегато