맞춤 검색 추천 추가

Android 검색 대화상자의 최근 검색어를 기반으로 추천 검색어를 제공하거나 검색 위젯을 사용할 수 있습니다. 예를 들어 사용자가 '강아지'를 검색하면 해당 검색어는 동일한 쿼리를 다시 입력하세요. 그림 1은 최근 쿼리가 포함된 검색 대화상자의 예를 보여줍니다. 있습니다.

시작하기 전에 기본 검색을 위한 검색 대화상자 또는 검색 위젯을 구현합니다. 사용할 수 있습니다 방법을 알아보려면 다음을 참조하세요. 검색 인터페이스를 만듭니다.

기본 사항

그림 1. 최근 쿼리가 포함된 검색 대화상자의 스크린샷 있습니다.

최근 추천 검색어는 저장된 검색어입니다. 사용자가 추천 검색어를 선택하면 검색 가능한 활동은 ACTION_SEARCH 인텐트 를 검색 활동에서 이미 처리하고 있는 검색어로 사용합니다.

최근 추천 검색어를 제공하려면 다음을 따라야 합니다.

  • 검색 가능 활동을 구현합니다.
  • 확장 가능한 콘텐츠 제공자 생성 SearchRecentSuggestionsProvider 애플리케이션 매니페스트에 이를 선언할 수 있습니다.
  • 다음 항목을 제공하는 콘텐츠 제공자에 대한 정보로 검색 가능한 구성을 수정합니다. 추천 검색어
  • 검색이 실행될 때마다 콘텐츠 제공자에 쿼리를 저장합니다.

Android 시스템이 검색 대화상자를 표시하는 것처럼 아래에 추천 검색어를 표시합니다. 검색 위젯을 사용할 수 있습니다. 시스템이 추천을 가져오는 소스를 제공합니다.

시스템이 사용자의 활동이 검색 가능한 것으로 식별되고 추천 검색어를 제시하면, 사용자가 검색어를 입력하면 다음과 같은 결과가 발생합니다.

  1. 시스템은 사용자가 입력을 시작하는 모든 검색어 텍스트를 받아서 추천 콘텐츠가 포함된 콘텐츠 제공자에게 쿼리를 수행합니다.
  2. 콘텐츠 제공업체가 모든 항목을 가리키는 Cursor 검색 쿼리 텍스트와 일치하는 추천 검색어 표시
  3. 시스템은 Cursor에서 제공하는 추천 목록을 표시합니다.

최근 추천 검색어가 표시되면 다음과 같은 결과가 발생할 수 있습니다.

  • 사용자가 다른 키를 입력하거나 어떤 식으로든 쿼리를 변경하는 경우 이전 단계가 추천 목록이 업데이트됩니다.
  • 사용자가 검색을 실행하면 추천 검색어가 무시되고 검색어가 검색 활동을 ACTION_SEARCH할 수 있습니다.
  • 사용자가 추천 검색어를 선택하면 ACTION_SEARCH 인텐트가 추천 텍스트를 검색어로 사용하여 검색 가능 활동

콘텐츠 제공자를 위해 확장하는 SearchRecentSuggestionsProvider 클래스 이전 단계의 작업을 자동으로 수행하므로 작성할 코드가 거의 없습니다.

콘텐츠 제공자 만들기

최근 검색어 추천에 필요한 콘텐츠 제공자는 SearchRecentSuggestionsProvider 이 수업은 모든 작업을 대신 수행합니다. 이제 코드 한 줄을 실행하는 클래스 생성자를 작성합니다.

예를 들어 다음은 최근 쿼리에 관한 콘텐츠 제공자의 전체 구현입니다. 제안:

Kotlin

class MySuggestionProvider : SearchRecentSuggestionsProvider() {
    init {
        setupSuggestions(AUTHORITY, MODE)
    }

    companion object {
        const val AUTHORITY = "com.example.MySuggestionProvider"
        const val MODE: Int = SearchRecentSuggestionsProvider.DATABASE_MODE_QUERIES
    }
}

자바

public class MySuggestionProvider extends SearchRecentSuggestionsProvider {
    public final static String AUTHORITY = "com.example.MySuggestionProvider";
    public final static int MODE = DATABASE_MODE_QUERIES;

    public MySuggestionProvider() {
        setupSuggestions(AUTHORITY, MODE);
    }
}

호출 setupSuggestions() 검색 권한의 이름과 데이터베이스 모드를 전달합니다. 검색 기관은 고유할 수 있습니다. 문자열이지만 콘텐츠 제공자에 대해 다음과 같이 정규화된 이름을 사용하는 것이 좋습니다. 패키지 이름 뒤에 제공자의 클래스 이름이 옵니다. 예: "com.example.MySuggestionProvider"

데이터베이스 모드에는 DATABASE_MODE_QUERIES 원하는 경우 DATABASE_MODE_2LINES, 그러면 추천 검색어 표에 열이 추가되어 각 단어와 함께 두 번째 텍스트 줄을 입력할 수 있습니다. 추천되지 않습니다. 각 제안에 두 줄을 제공하려면 다음 예를 참고하세요.

Kotlin

const val MODE: Int = DATABASE_MODE_QUERIES or DATABASE_MODE_2LINES

자바

public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;

애플리케이션 매니페스트에 콘텐츠 제공자를 선언할 때 검색 가능한 구성에서 SearchRecentSuggestionsProvider 클래스로 바꿔보세요. 예를 들면 다음과 같습니다.

<application>
    <provider android:name=".MySuggestionProvider"
              android:authorities="com.example.MySuggestionProvider" />
    ...
</application>

검색 가능한 구성 수정

추천 제공자를 사용하도록 시스템을 구성하려면 android:searchSuggestAuthorityandroid:searchSuggestSelection 속성을 검색 가능한 구성 파일의 <searchable> 요소에 추가합니다. 예를 들면 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_label"
    android:hint="@string/search_hint"
    android:searchSuggestAuthority="com.example.MySuggestionProvider"
    android:searchSuggestSelection=" ?" >
</searchable>

android:searchSuggestAuthority 값은 콘텐츠 제공자에서 사용되는 권한과 정확히 일치하는 콘텐츠 제공자(예: 위의 예에서는 "com.example.MySuggestionProvider"입니다.

android:searchSuggestSelection 값은 앞에 오는 물음표 하나여야 합니다. 스페이스: " ?" 이는 SQLite 선택 인수의 자리표시자이며 사용자가 입력한 쿼리 텍스트로 자동 대체됩니다.

쿼리 저장

최근 쿼리 컬렉션을 채우려면 검색 가능한 쿼리에서 받은 각 쿼리를 추가하세요. SearchRecentSuggestionsProvider에 활동을 추가할 수 있습니다. 이렇게 하려면 SearchRecentSuggestions 및 호출 saveRecentQuery() 검색 가능한 활동이 검색어를 받을 때마다 예를 들어, 쿼리를 저장하여 활동을 시작하는 동안 onCreate() 메서드를 사용하여 축소하도록 요청합니다.

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

    if (Intent.ACTION_SEARCH == intent.action) {
        intent.getStringExtra(SearchManager.QUERY)?.also { query ->
            SearchRecentSuggestions(this, MySuggestionProvider.AUTHORITY, MySuggestionProvider.MODE)
                    .saveRecentQuery(query, null)
        }
    }
}

자바

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent  = getIntent();

    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
                MySuggestionProvider.AUTHORITY, MySuggestionProvider.MODE);
        suggestions.saveRecentQuery(query, null);
    }
}

SearchRecentSuggestionsProvider 생성자에는 콘텐츠 제공자가 선언한 것과 동일한 권한 및 데이터베이스 모드를 사용합니다.

saveRecentQuery() 메서드는 검색어 문자열을 첫 번째 매개변수로 사용합니다. 그리고 선택적으로 추천의 두 번째 줄이나 null로 포함할 두 번째 문자열입니다. 두 번째 매개변수는 DATABASE_MODE_2LINES 두 줄 모드를 사용 설정하면 쿼리 텍스트가 두 번째 줄이 표시됩니다.

추천 데이터 지우기

사용자의 개인 정보를 보호하기 위해 항상 사용자가 최근 쿼리를 지울 수 있는 방법을 제공해야 합니다. 있습니다. 쿼리 기록을 지우려면 다음을 호출합니다. clearHistory() 예를 들면 다음과 같습니다.

Kotlin

SearchRecentSuggestions(this, HelloSuggestionsProvider.AUTHORITY, HelloSuggestionsProvider.MODE)
        .clearHistory()

자바

SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
        HelloSuggestionProvider.AUTHORITY, HelloSuggestionProvider.MODE);
suggestions.clearHistory();

'검색 기록 삭제'를 선택하여 실행합니다. 메뉴 항목, 환경설정 항목 또는 버튼이 있습니다. 사용자가 검색 기록을 삭제하기를 원하는지 확인하는 확인 대화상자를 제공합니다.