- Оптимизируйте ваше мобильное приложение для Google
- 1. Что такое индексирование приложений?
- Зачем разработчикам это нужно?
- Как это технически возможно?
- 2. Давайте сделаем это
- Шаг 1
- Шаг 2
- Шаг 3
- 3. Тестируем
- Заключение
- Использование Android Search Dialog. Пример простого приложения
- Немного теории
- Конфигурационный файл
- Создаем Activity
- Выполнение поиска
- Исходный код
Оптимизируйте ваше мобильное приложение для Google
Russian (Pусский) translation by Ellen Nelson (you can also view the original English article)
Вы когда-нибудь задумывались, как эти таинственные ссылки, указывающие на приложения, появляются в результатах поиска при поиске в Интернете с помощью Google? Как разработчики приложений могут убедиться, что их приложения отображаются там?
В этом уроке я продемонстрирую, как достичь этого эффекта для ваших приложений.
1. Что такое индексирование приложений?
Индексирование приложений в Google (теперь переименовано в индексирование приложений Firebase) позволяет приложениям отображаться в результатах поиска Google, как если бы они были обычными веб-страницами. Приложения, которые появляются вместе с обычными веб-страницами, отображаются, когда отправляется определенный поисковый запрос из браузера соответствующего устройства. В настоящее время эта функция поддерживается на платформах Android и iOS.
Зачем разработчикам это нужно?
Индексирование приложений сильно увеличивает шансы разработчика на успех, поскольку он выполняет две важные задачи одновременно.
Во-первых, это улучшает и расширяет возможности пользователя. Если найдено приложение, релевантное поисковому запросу, пользователю предоставляется возможность установить приложение или сразу запустить приложение (если оно уже установлено на устройстве), даже не покидая браузер. Таким образом, пользователи получат положительное первое впечатление о таком приложении, и они бессознательно оценят тот факт, что приложение удалось найти в правильном контексте и что оно предоставило им несколько вариантов для рассмотрения.
Во-вторых, это помогает разработчикам продвигать свои приложения непосредственно через поисковую систему Google. Разработчики могут использовать этот механизм для привлечения трафика непосредственно в свои приложения и значительно увеличить количество загрузок.
Как это технически возможно?
Индексирование приложений работает по своей магии довольно простым, но умным способом установления связи между приложением и его веб-сайтом, четко называемым «ассоциация сайта». Рабочий процесс состоит из нескольких этапов:
- Добавление Intent Filter для поддержки URL-адресов и поиска Google
- Связывание веб-сайта с приложением
- Добавление API кода индексации приложений
2. Давайте сделаем это
Теперь, когда у нас есть идея рабочего процесса, мы проделаем каждый шаг и, наконец, протестируем нашу реализацию на Android Studio. Итак, мы создадим новый Android-проект на Android Studio IDE. На вашем компьютере должно быть установлено Android Studio 2.0 или более поздняя версия. Создайте новый проект Android с Empty Activity. Я использовал MyApp как название для моего нового проекта Android.
Шаг 1
Мы начнем с добавления Intent Filter для поддержки URL-адресов и поиска Google. Intents — это коммуникационные агенты между компонентами приложений Android, а использование Intent Filters является стандартным способом введения скрытого «намерения» в ваше приложение.
Неявное «намерение» в вашем приложении позволяет ему делать запросы, чтобы операционная система оценивала все соответствующие зарегистрированные компоненты (возможно, в других установленных приложениях) и выбирала один из них, тем самым позволив выполнить определенную задачу с помощью другого приложения, установленного в системе. Напротив, явное «намерение» прямо указывает целевой компонент приложения, поэтому для выполнения этого действия будет вызван только указанный компонент. Вы можете узнать больше о «Намерениях» и «Фильтрах Намерений» на сайте Android Developers.
Теперь мы начнем создавать «Фильтр намерений» — Intent Filter.
- Откройте файл AndroidManifest.xml.
- Курсором выберите элемент .
- Щелкните правой кнопкой мыши, по выбранному элементу, а затем выберите Generate из всплывающего меню.
- Далее выберите URL из второго всплывающего меню.
Вы увидите, что Android Studio добавила дополнительный код в файл AndroidManifest.xml. Вы можете изменить атрибуты элемента , сгенерированного кода в соответствии с вашими требованиями. В моем случае, я предоставил значение, связанное с моим демо сайтом.
Обязательно укажите необходимые значения для обеих схемы http и https .
Шаг 2
Теперь нам нужно связать веб-сайт с нашим приложением.
Вам нужно будет подтвердить веб-адрес, который вы хотите связать с приложением, используя Google Search Console. Просто войдите в Search Console с учетной записью Google, и вы найдете простые инструкции по проверке URL.
Вы также можете найти подробные инструкции о том, как определить структуру соответствующего веб-сайта, для соответствия вашего приложения в руководстве Firebase App Indexing Guide. Однако, поскольку мы только тестируем приложение с помощью Android Studio, нет необходимости рассматривать эти детали в данном уроке.
Для наших тестовых целей все, что нам нужно — это рабочий веб-сайт, проверенный Google. Атрибуты, которые вы предоставили для на шаге 1, должны соответствовать этому проверенному реальному веб-адресу.
Шаг 3
Наконец, мы добавим код App Indexing API. Android Studio предоставляет автоматизированный способ осуществить это:
- Откройте файл MainActivity.java вашего проекта Android.
- Курсором выберите слово OnCreate .
- Щелкните правой кнопкой мыши по этому выбору, и из всплывающего меню выберите Generate.
- Далее выберите App Indexing API Code из второго всплывающего меню.
Вы увидите автоматически сгенерированный код, добавленный Android Studio в файл MainActivity.java. Обязательно измените ссылки в функции Uri.parse() , так чтобы они правильно указывали на URL-адрес, связанный с вашим приложением.
3. Тестируем
Теперь мы протестируем нашу работу в Android Studio, чтобы убедиться, что наша реализация индексирования приложений работает правильно. Во-первых, убедитесь, что вы подключены к Интернету. Затем в Android Studio, выберите Tools > Android > Google App Indexing Test.
Через некоторое время появится экран, аналогичный приведенному ниже. Если тест будет успешно пройден, то это говорит о том, что индексирование будет работать правильно с вашем приложением.
Заключение
Индексирование приложений — полезная функция для вашего приложения, которая приводит к большему количеству загрузок, и это определенно поможет вам полагаться на более широкую пользовательскую базу в качестве разработчика. На этом уроке мы проверили, правильно ли работает наша реализация индексирования приложений, но не так, как пользователь воспринимает функциональность, возникающую в результате реализации. Вы можете перейти на следующий уровень, найдя больше информации в Firebase, Google Webmasters и вебсайте Справка по индексация приложений в Android Studio.
Источник
Использование Android Search Dialog. Пример простого приложения
Данная статья предназначена для тех, кто уже написал свой HelloWorld для Android и знает, что такое Activity и Intent, а так же где находится манифест, и зачем нужны layout’ы. В противном случае, можно ознакомиться с этим материалом, например, на developer.android.com.
В статье описывается создание несложного приложения, которое использует механизм реализации поиска, основанный на возможностях встроенного фреймворка. После прочтения вы также сможете настроить свое приложение таким образом, чтобы оно осуществляло поиск по данным, используя стандартный Android Search Dialog.
Немного теории
Android Search Dialog (далее — «диалог поиска») управляется с помощью поискового фреймворка. Это означает, что разработчику не нужно задумываться над тем как его нарисовать или как отловить поисковый запрос. За вас эту работу сделает SearchManager.
Итак, когда пользователь запускает поиск, SearchManager создает Intent, и направляет его к Activity, которое отвечает за поиск данных (при этом сам запрос помещается в экстры). То есть по сути в приложении должно быть хотя бы одно Activity, которое получает поисковые Intent’ы, выполняет поиск, и предоставляет пользователю результаты. Для реализации потребуется следующее:
- Конфигурационный xml файл (в нем содержится информация о диалоге)
- Activity, которое будет получать поисковые запросы, выполнять поиск и выводить результаты на экран
- Механизм вызова поискового диалога (так как не все устройства с Android на борту имеют на корпусе кнопку поиска)
Конфигурационный файл
xml version =»1.0″ encoding =»utf-8″ ? >
searchable xmlns:android =»http://schemas.android.com/apk/res/android»
android:label =»@string/app_name»
android:hint =»@string/search_hint»
>
searchable >
* This source code was highlighted with Source Code Highlighter .
Обязательным атрибутом является только android:label, причем он должен ссылаться на строку, которая является такой же, что и название приложения. Второй атрибут, android:hint используется для отображения строки в пустом диалоге. Например, это может быть «Поиск по Видео» или «Поиск контактов» и т.п. Этот атрибут указывает на то, по каким данным осуществляется поиск. Также важно знать, что элемент searchable поддерживает множество других атрибутов, подробнее можно прочесть Здесь.
Создаем Activity
Минимально, всё что нам нужно от пользовательского интерфейса Activity — это список для вывода результатов поиска и механизм вызова поискового диалога. Так и сделаем, добавив только поле для ввода текста и кнопку, чтобы мы сами могли заполнять базу. Забегая вперед, скажу, что данные будем хранить в БД SQLite.
Опишем интерфейс Activity следующим образом (файл находится в res/layout/main.xml).
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» >
LinearLayout
android:orientation =»horizontal»
android:layout_width =»fill_parent»
android:layout_height =»wrap_content»
android:gravity =»top» >
EditText
android:id =»@+id/text»
android:layout_width =»wrap_content»
android:layout_height =»wrap_content»
android:hint =»@string/text»
android:layout_weight =»100.0″/>
Button
android:id =»@+id/add»
android:layout_width =»wrap_content»
android:layout_height =»wrap_content»
android:text =»@string/add»/>
LinearLayout >
ListView
android:id =»@android:id/list»
android:layout_width =»fill_parent»
android:layout_height =»wrap_content»/>
TextView
android:layout_gravity =»left»
android:id =»@android:id/empty»
android:layout_width =»fill_parent»
android:layout_height =»fill_parent»
android:text =»@string/no_records»/>
LinearLayout >
* This source code was highlighted with Source Code Highlighter .
Выглядит следующим образом:
Также нам понадобится layout для вида элемента списка, опишем его простейшим образом (файл находится в res/layout/record.xml)
xml version =»1.0″ encoding =»utf-8″ ? >
TextView
android:id =»@+id/text1″
xmlns:android =»http://schemas.android.com/apk/res/android»
android:layout_width =»wrap_content»
android:layout_height =»wrap_content»
/>
* This source code was highlighted with Source Code Highlighter .
Также, не забываем про файл ресурсов, где хранятся наши строки (файл в res/values/strings.xml)
xml version =»1.0″ encoding =»utf-8″ ? >
resources >
string name =»app_name» > SearchExample string >
string name =»add» > Add string >
string name =»text» > Enter text string >
string name =»no_records» > There are no records in the table string >
string name =»search_hint» > Search the records string >
string name =»search» > Search string >
resources >
* This source code was highlighted with Source Code Highlighter .
xml version =»1.0″ encoding =»utf-8″ ? >
manifest xmlns:android =»http://schemas.android.com/apk/res/android»
package =»com.example.search»
android:versionCode =»1″
android:versionName =»1.0″ >
application android:icon =»@drawable/icon» android:label =»@string/app_name» >
activity android:name =».Main»
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.SEARCH»/>
intent-filter >
meta-data
android:name =»android.app.searchable»
android:resource =»@xml/searchable»
/>
activity >
application >
uses-sdk android:minSdkVersion =»5″/>
* This source code was highlighted with Source Code Highlighter .
Сейчас, вы уже можете проверить, все ли вы сделали правильно. Вызвать диалог на эмуляторе можно, например, нажав кнопку поиска. Ну или если вы проверяете на девайсе, то зажав «Меню». Выглядеть должно примерно так:
Выполнение поиска
Получение запроса
Так как SearchManager посылает Intent типа Search нашему Activity, то всё что нужно сделать это проверить на Intent этого типа при старте Activity. Тогда, если мы получаем нужный Intent, то можно извлекать из него экстру и выполнять поиск.
Поиск данных
Так как тип структуры хранения данных для разных приложений может различаться, то и методы для них свои. В нашем случае, проще всего выполнить запрос по таблице БД SQLite запросом LIKE. Конечно, лучше использовать FTS3, он значительно быстрее, подробнее о FTS3 можно прочесть на сайте SQLite.org. В идеале, также нужно всегда рассчитывать, что поиск может занять продолжительное время, поэтому можно создать какой-нибудь ProgressDialog, чтобы у нас не завис интерфейс, и чтобы пользователь знал, что приложение работает.
Вывод результатов
Вообще вывод результатов — это проблема UI, но так как мы используем ListView, то для нас проблема решается простым обновлением адаптера.
Исходный код
Наконец, привожу полный исходный код двух классов с комментариями. Первый — Main, наследник ListActivity, он используется для наполнения БД и вывода результатов. Второй класс — RecordsDbHelper, он реализует интерфейс для взаимодействия с БД. Самые важные методы — добавление записей и поиск совпадений, с помощью запроса LIKE.
import android.app.ListActivity;
import android.app.SearchManager;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SimpleCursorAdapter;
public class Main extends ListActivity <
private EditText text;
private Button add;
private RecordsDbHelper mDbHelper;
@Override
public void onCreate(Bundle savedInstanceState) <
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//Создаем экземпляр БД
mDbHelper = new RecordsDbHelper( this );
//Открываем БД для записи
mDbHelper.open();
//Получаем Intent
Intent intent = getIntent();
//Проверяем тип Intent
if (Intent.ACTION_SEARCH.equals(intent.getAction())) <
//Берем строку запроса из экстры
String query = intent.getStringExtra(SearchManager.QUERY);
//Выполняем поиск
showResults(query);
>
add = (Button) findViewById(R.id.add);
text = (EditText) findViewById(R.id.text);
add.setOnClickListener( new View.OnClickListener() <
public void onClick(View view) <
String data = text.getText().toString();
if (!data.equals( «» )) <
saveTask(data);
text.setText( «» );
>
>
>);
>
private void saveTask( String data) <
mDbHelper.createRecord(data);
>
private void showResults( String query) <
//Ищем совпадения
Cursor cursor = mDbHelper.fetchRecordsByQuery(query);
startManagingCursor(cursor);
String [] from = new String [] < RecordsDbHelper.KEY_DATA >;
int [] to = new int [] < R.id.text1 >;
SimpleCursorAdapter records = new SimpleCursorAdapter( this ,
R.layout.record, cursor, from , to);
//Обновляем адаптер
setListAdapter(records);
>
//Создаем меню для вызова поиска (интерфейс в res/menu/main_menu.xml)
public boolean onCreateOptionsMenu(Menu menu) <
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return true ;
>
public boolean onOptionsItemSelected(MenuItem item) <
switch (item.getItemId()) <
case R.id.search_record:
onSearchRequested();
return true ;
default :
return super.onOptionsItemSelected(item);
>
>
>
* This source code was highlighted with Source Code Highlighter .
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class RecordsDbHelper <
public static final String KEY_DATA = «data» ;
public static final String KEY_ROWID = «_id» ;
private static final String TAG = «RecordsDbHelper» ;
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
private static final String DATABASE_CREATE = «CREATE TABLE records(_id INTEGER PRIMARY KEY AUTOINCREMENT, »
+ «data TEXT NOT NULL);» ;
private static final String DATABASE_NAME = «data» ;
private static final String DATABASE_TABLE = «records» ;
private static final int DATABASE_VERSION = 1;
private final Context mCtx;
private static class DatabaseHelper extends SQLiteOpenHelper <
DatabaseHelper(Context context) <
super(context, DATABASE_NAME, null , DATABASE_VERSION);
>
@Override
public void onCreate(SQLiteDatabase db) <
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) <
Log.w(TAG, «Upgrading database from version » + oldVersion + » to »
+ newVersion + «, which will destroy all old data» );
db.execSQL( «DROP TABLE IF EXISTS tasks» );
onCreate(db);
>
>
public RecordsDbHelper(Context ctx) <
this .mCtx = ctx;
>
public RecordsDbHelper open() throws SQLException <
mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase();
return this ;
>
public void close() <
mDbHelper.close();
>
//Добавляем запись в таблицу
public long createRecord( String data) <
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_DATA, data);
return mDb.insert(DATABASE_TABLE, null , initialValues);
>
//Поиск запросом LIKE
public Cursor fetchRecordsByQuery( String query) <
return mDb.query( true , DATABASE_TABLE, new String [] < KEY_ROWID,
KEY_DATA >, KEY_DATA + » LIKE» + «‘%» + query + «%'» , null ,
null , null , null , null );
>
>
* This source code was highlighted with Source Code Highlighter .
Источник