Обработка приложением запросов ACTION_SEND

| 17.03.2015

Мы уже рассмотрели, как можно отправить данные другим приложениям, используя ACTION_SEND. В этот раз мы создадим приложение, которое способно обрабатывать подобные запросы и принимать отправляемые данные.

Наше приложение будет включать в себя два Активити. Первое (основное) будет запускаться при запуске приложения и будет выводить на экран строку, хранящуюся в Preferences. Второе Активити будет запускаться системой в ответ на запрос ACTION_SEND. Оно будет доставать из Intent-а отправленные данные (текстовую строку) и сохранять их в Preferences. Таким образом, одно Активити данные получает и сохраняет, а другое отображает.

1. Добавим строковые ресурсы res/values/strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">SendHandler</string>
    <string name="title_activity_send_handler">SendHandler</string>
</resources>

2. Создадим layout для основного Активити — res/layout/activity_main.xml

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/sharedText"        
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

Добавьте значения отступов в res/values/dimens.xml

<resources>
    <!-- Default screen margins, per the Android Design guidelines. -->
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>
</resources>

3. Код MainActivity.java

package ru.androiddocs.sendhandler;

import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity {

    private TextView mTxtV;
    private SharedPreferences mPref;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTxtV = (TextView) findViewById(R.id.sharedText);
        mPref = PreferenceManager.getDefaultSharedPreferences(this);
    }

    @Override
    protected void onResume() {
        super.onResume();

        mTxtV.setText(mPref.getString("sharedText", ""));
    }
}

Код простой, поэтому оставил его без комментариев. Думаю, вы обратили внимание, что установку текста мы поместили в метод onResume(). Это сделано для того, чтобы при каждом открытии приложения мы имели всегда свежие данные (рекомендую почитать про жизненный цикл приложения).

4. Добавим код второго Активити — SendHandlerActivity.java (layout нам здесь не нужен)

package ru.androiddocs.sendhandler;

import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;

public class SendHandlerActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = getIntent();
        String action = intent.getAction();
        String type = intent.getType();

        if (Intent.ACTION_SEND.equals(action) && type != null) {
            if ("text/plain".equals(type)) {
                String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);

                SharedPreferences mPref = PreferenceManager.getDefaultSharedPreferences(this);
                SharedPreferences.Editor editPref = mPref.edit();
                editPref.putString("sharedText", sharedText);
                editPref.commit();

            }
        }

        finish();
    }
}

В методе onCreate() мы получаем объект Intent-а, определяем действие и тип передаваемых данных. Конструкцию if теоретически можно убрать, если вы не используете несколько различных ACTION для данного Активити (в нашем примере это только ACTION_SEND). Если тип данных совпадает с «text/plain», то сохраняем данные в Preferences.

Дестроим Активити методом finish().

5. Важным моментом является файл манифеста. Здесь должны быть прописаны оба Активити и соответствующий intent-filter для ACTION_SEND

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ru.androiddocs.sendhandler" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".SendHandlerActivity"
            android:label="@string/title_activity_send_handler" >
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Возможность обработки действия для Активити указана в следующих строках:

<intent-filter>
    <action android:name="android.intent.action.SEND" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="text/plain" />
</intent-filter>

Итак, можно тестить. Запустите приложение — должен отобразиться пустой экран.

Обработка приложением запросов ACTION_SEND

Теперь запустите прошлое приложение для отправки данных и отправьте какую-строку.

Обработка приложением запросов ACTION_SEND

В списке приложений выберите только что созданное приложение (у меня SendHandler).

Обработка приложением запросов ACTION_SEND

После того, как данные будут отправлены, зайдите в приложение SendHandler. На экране должна отобразиться отправленная строка.

Обработка приложением запросов ACTION_SEND

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*