Android как система предназначена для эффективной совместной работы различных компонентов. Таким образом, Android предоставляет множество сервисов для создания слабосвязанных компонентов, которые могут эффективно взаимодействовать.
Намерения — это механизм передачи сообщений, предоставляемый в Android, и они асинхронны по своей природе. Один компонент может отправить Намерение другому компоненту, чтобы запросить определенную функциональность или функцию. Например, приложение для чтения электронной почты может отправить намерение другому действию, которое может получить имя пользователя и пароль от пользователя, чтобы выполнить проверку пользователя.
Типы намерений в Android
Явный Намерение
В явном намерении отправитель намерения явно упоминает компонент, который должен получить намерение. Это можно сделать с помощью идентификатора класса Java.
Неявное намерение
В неявном намерении отправляющий компонент точно не указывает принимающий компонент, отправляющий компонент просто упомянет действие, которое необходимо выполнить. Компонент отправки может дополнительно отправлять дополнительный URI и данные с намерением.
Различные компоненты могут зарегистрировать себя как получателя намерений, указав тег фильтра намерений в своем файле AndroidManifest.xml.
Как использовать Intents для вызова нативного приложения Android
Родные приложения для Android также используют намерения. Вы даже можете передать намерения из своего приложения для запуска и использования некоторых собственных приложений Android, таких как номеронабиратель или веб-браузер.
Теперь мы рассмотрим приложение, в котором мы создадим действие. В упражнении мы примем текст смс и номер от пользователя.
Затем мы запустим приложение sms, передав намерение системе Android. Мы передадим номер и смс сообщение в приложение смс.
Шаг 1. Создание макета и пользовательского интерфейса.
Для этого мы сначала создаем действие, называемое LaunchIntentActivity, а затем создаем макет следующим образом.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TableLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:stretchColumns="1,2" > <TableRow> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="2dip" android:paddingRight="4dip" android:text="Message Text:" /> <EditText android:id="@+id/messageText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:cursorVisible="true" android:editable="true" android:singleLine="true" android:layout_weight="1" /> </TableRow> <TableRow> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="2dip" android:paddingRight="4dip" android:text="Recipient Number" /> <EditText android:id="@+id/messageNumber" android:layout_width="fill_parent" android:layout_height="wrap_content" android:cursorVisible="true" android:editable="true" android:singleLine="true" android:layout_weight="1" /> </TableRow> </TableLayout> <Button android:id="@+id/show" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Show Message!" android:onClick="showMessage" /> </LinearLayout>
Здесь мы сначала создали линейный макет, добавили два TextView и два EditText для отображения пользователю и для получения номера и текста смс от пользователя. Я также создал кнопку с именем showMessage, при нажатии которой будет вызываться функция showMessage.
Ниже приведен код для действия.
package launchIntent.com; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.EditText; public class LaunchIntentActivity extends Activity { private EditText messageText; private EditText messageNumber; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); messageText=(EditText)findViewById(R.id.messageText); messageNumber=(EditText)findViewById(R.id.messageNumber); } public void showMessage(View v) { String _messageText=messageText.getText().toString(); String _messageNumber=messageNumber.getText().toString(); Intent sendIntent = new Intent(Intent.ACTION_VIEW); sendIntent.setData(Uri.parse("sms:"+_messageNumber)); sendIntent.putExtra("sms_body", _messageText); startActivity(sendIntent); } }
Шаг 2. Инициализация для Действия
В функции onCreate мы устанавливаем основной макет, который мы создали, как представление контента. Тогда у нас есть два закрытых члена для каждого из EditText, который у нас есть.
public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); messageText=(EditText)findViewById(R.id.messageText); messageNumber=(EditText)findViewById(R.id.messageNumber); }
Интерфейс действия будет выглядеть следующим образом:
Шаг 3. Отправка Намерения
При нажатии кнопки Показать сообщение вызывается функция showMessage.
public void showMessage(View v) { String _messageText=messageText.getText().toString(); String _messageNumber=messageNumber.getText().toString(); Intent sendIntent = new Intent(Intent.ACTION_VIEW); sendIntent.setData(Uri.parse("sms:"+_messageNumber)); sendIntent.putExtra("sms_body", _messageText); startActivity(sendIntent); }
При этом мы получаем значения, введенные пользователем, и сохраняем их в строковых переменных.
Затем мы создаем намерение ACTION_VIEW и передаем ему URI в виде sms: Number, введенного пользователем.
В намерениях мы можем добавить дополнительные данные, которые будут переданы получателю намерения. Это делается с помощью метода putExtra в намерении. Мы добавляем дополнительные данные, называемые sms_body, и передаем данные, введенные пользователем.
Затем мы отправляем намерение с помощью функции startActivity и передаем ему объект намерения.
Это запустит приложение sms с номером и сообщением, предварительно заполненными значениями, которые мы отправили, как показано ниже.
Как поймать какой-то нативный Android-экшн с помощью интентов
Как указано выше, все события, которые происходят в системе Android, передаются через намерения. Таким образом, вы можете зарегистрировать свое приложение для запуска, когда происходит определенное событие. Вы можете зарегистрировать свою деятельность для обслуживания намерения, добавив тег фильтра намерений под тегом активности в AndroidManifest.xml.
Сейчас мы собираемся написать и деятельность, которая будет вызываться всякий раз, когда контакт должен быть отправлен смс.
Шаг. 1 Создайте действие CatchSmsIntent
Сначала нам нужно создать простое действие, которое мы зарегистрируем для запуска, когда предполагается, что контакт будет смс.
package catchSmsIntent.com; import android.app.Activity; import android.os.Bundle; public class CatchSmsIntent extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //----------------------------------- //Code to handle the sms //----------------------------------- } }
Шаг 2. Добавьте интент-фильтр
Откройте файл AndroidManifest.xml и под действием добавьте тег, чтобы поймать действие android.intent.action.SENDTO
.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="catchSmsIntent.com" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".CatchSmsIntent" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SENDTO" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="sms" /> <data android:scheme="smsto" /> </intent-filter> </activity> </application> </manifest>
?<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="catchSmsIntent.com" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".CatchSmsIntent" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SENDTO" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="sms" /> <data android:scheme="smsto" /> </intent-filter> </activity> </application> </manifest>
Когда мы добавляем этот фильтр намерений, мы регистрируем нашу деятельность в системе Android, которая должна запускать наше приложение, когда предполагается, что контакт является текстовым сообщением.
Из контактов выберите Текстовый контакт.
Это запустит средство выбора приложений для Android с CatchSmsIntent в качестве одного из параметров, как показано ниже.
Использование Intents для связи между двумя конкретными действиями (Explicit Intents)
Как описано ранее, явные намерения — это намерения, когда вы указываете точный получатель намерения. Следовательно, намерения могут использоваться для передачи сообщений и данных между двумя действиями.
Теперь мы увидим это в следующей программе. В этой программе мы собираемся создать два вида деятельности. Первое действие создает два EditText, чтобы получить два числа от пользователя. Затем он передаст эти числа через намерение, которое спросит пользователя, какую операцию он хочет выполнить. Поддерживаются следующие операции: сложение и сложение, которые складывают или вычитают два числа соответственно.
Шаг 1. Вызывающая деятельность
Код для вызова деятельности выглядит следующим образом.
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class CallingActivity extends Activity { /** Called when the activity is first created. */ private EditText number1; private EditText number2; private static final int REQUEST_CODE = 10; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); number1=(EditText)findViewById(R.id.number1); number2=(EditText)findViewById(R.id.number2); } public void getOperation(View v) { String _number1=number1.getText().toString(); String _number2=number2.getText().toString(); Intent i = new Intent(this, CalledActivity.class); i.putExtra("number1", _number1); i.putExtra("number2", _number2); // Set the request code to any code you like, you can identify the // callback via this code startActivityForResult(i, REQUEST_CODE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) { if (data.hasExtra("result")) { Toast.makeText(this, data.getExtras().getString("result"), Toast.LENGTH_SHORT).show(); } } } }
Это действие создает два EditText, чтобы взять два числа и одну кнопку.
При нажатии на кнопку getOperation
функция getOperation
.
public void getOperation(View v) { String _number1=number1.getText().toString(); String _number2=number2.getText().toString(); Intent i = new Intent(this, CalledActivity.class); i.putExtra("number1", _number1); i.putExtra("number2", _number2); // Set the request code to any code you like, you can identify the // callback via this code startActivityForResult(i, REQUEST_CODE); }
В этой функции сначала введенные пользователем значения принимаются в переменные. Затем мы должны создать намерение со вторым параметром как CalledActivity.class
который является идентификатором класса Java для второго действия, которое мы создадим. Это будет получатель намерения.
Два числа передаются в CalledActivity в рамках намерения с использованием метода putExtra.
Затем мы вызываем функцию startActivityForResult с намерением и кодом запроса. Когда второе действие завершит обслуживание намерения, оно вызовет onActivityResult текущего действия с тем же кодом запроса, чтобы определить, что возвращенный результат предназначен для этого намерения.
Шаг 2. Вызываемая активность
Ниже приведен код для вызываемой деятельности.
package explicitIntents.com; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.EditText; public class CalledActivity extends Activity { /** Called when the activity is first created. */ private EditText operation; private String value1; private String value2; private String result; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.calledactivitylayout); operation=(EditText)findViewById(R.id.operation); Bundle extras = getIntent().getExtras(); if (extras == null) { return; } value1 = extras.getString("number1"); value2 = extras.getString("number2"); } public void setOperation(View v) { String _operation = operation.getText().toString(); if( _operation.equals("add") ) { int answer = Integer.parseInt(value1) + Integer.parseInt(value2); result = "" + answer; } else if( _operation.equals("sub") ) { int answer = Integer.parseInt(value1) - Integer.parseInt(value2); result = "" + answer; } // Other operations ........ can be added here finish(); } @Override public void finish() { Intent data = new Intent(); data.putExtra("result", result); setResult(RESULT_OK, data); super.finish(); } }
Вызванная активность в onCreate получает значения, переданные ей в намерении, используя функцию getIntent().getExtras();
Он также устанавливает макет с одним EditText и одной кнопкой при его setOperation
вызывается функция setOperation
. При этом берется значение операции, введенное пользователем, и соответствующий результат сохраняется в результате переменной-члена.
Затем вызывается функция finish
которая создает новое намерение отправить результат обратно в CallingActivity путем вызова setResult
и передачи ему намерения.
Шаг 3. Получение результата
Когда вызываемое действие возвращает функцию onActivityResult, вызывается с кодом запроса, кодом результата и намерением.
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) { if (data.hasExtra("result")) { Toast.makeText(this, data.getExtras().getString("result"), Toast.LENGTH_SHORT).show(); } } } }
Здесь мы проверяем, если результат в порядке, и код запроса тот, который мы отправили с намерением.
Затем мы возвращаем результат из намерения с помощью функции data.getExtras().getString("result")
и передаем его в Toast, чтобы показать результат пользователю.
Именно так можно использовать явные намерения для передачи данных и получения результатов между действиями.
Вывод
Android предоставляет множество сервисов для создания великолепных, гибких приложений поверх своей системы.
Intents предоставляют приложениям простой и гибкий способ передачи сообщений между собой, а также позволяют создавать гибкие приложения, которые могут: