完全な例はGitHubサンプルアプリケーションで入手できます。 これには、UIのカスタマイズ、バックグラウンドサービスへの接続、およびアプリケーションとカスタムタブアクティビティの両方のライフサイクこのページのガイダンスに従うと、優れた統合を作成することができます。
カスタムタブ統合の最初のステップは、AndroidXブラウザライブラリをプロジェクトに追加することです。 app/build.gradle
ファイルを開き、ブラウザライブラリをdependenciesセクションに追加します。
dependencies {
...
implementation "androidx.browser:browser:1.3.0"
}
ブラウザライブラリがプロジェクトに追加されると、可能なカスタマイズの二つのセットがあります。
- UIのカスタマイ
- ページの読み込みを高速化し、アプリケーションを生きたままにします。UIのカスタマイズは、
CustomTabsIntent
CustomTabsIntent.Builder
CustomTabsClient
を使用してカスタムタブサービスに接続し、ブラウザをウォームアップして、どのurlが開かれるかを知らせることによ
カスタムタブを開く#
A
CustomTabsIntent.Builder
CustomTabsIntent.Builder.build
CustomTabsIntent
CustomTabsIntent.launchUrl
で目的のUrlを起動します。String url = ¨https://paul.kinlan.me/¨;
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(this, Uri.parse(url));アドレスバーの色を設定#
カスタムタブの最も重要な(そして実装するのが最も簡単な)側面の一つは、あなたのアプリのテーマ
以下のスニペットは、アドレスバーの背景色を変更します。 colorIntは、
Color
を指定するintです。int coolorInt = Color.parseColor("#FF0000"); //red
builder.setToolbarColor(colorInt);カスタムアクションボタンを設定#
builder.setActionButton(icon, description, pendingIntent, tint);
アプリの開発者として、ブラウザタブ内でユーザーに表示されるアクションボタンを完全に制御することができます。
ほとんどの場合、これは共有などの主要なアクション、またはユーザーが実行する別の一般的なアクティビティになります。
アクションボタンは、アクションボタンのアイコンと、ユーザーがアクションボタンを押したときにブラウザによって呼び出される
PendingIntent
を持つバンドルとして表されます。 アイコンは、高さが24dp、幅が24-48dpのcurrenltyです。アクションボタンのイメージソースとして使用する
CustomTabsIntentBuilder#setActionButton
:icon
Bitmap
です。description
String
PendingIntent
です。 ブラウザは、urlをデータとして追加した後、タップでPendingIntent#send
Intent#getDataString
を呼び出してurlを取得できます。tint
は、アクションボタンを着色するかどうかを定義するブール値です。
カスタムメニューを設定する#
builder.addMenuItem(menuItemTitle, menuItemPendingIntent);
ブラウザには、ユーザーがブラウザ内で頻繁に実行するアクションの包括的なメニューがありますが、アプリケーションコンテキストには関連しない場合があります。
カスタムタブには、ブラウザによって提供されるデフォルトのアクションのセットがあります。 これらのアクションには、”転送”、”ページ情報”、”更新”、”ページ内の検索”、”ブラウザで開く”などの項目が含まれます。
開発者は、アイコンの行と足の項目の間に表示される最大5つのメニュー項目を追加およびカスタマイズできます。
メニュー項目は、タイトルと
CustomTabsIntent.Builder#addMenuItem
PendingIntent
ユーザーが項目をタップしたときにブラウカスタム入力と終了アニメーションを設定#
多くのAndroidアプリケーションは、Android上のアクティビティ間を移行するときにカスタムビューの入 カスタムタブは違いはありません、あなたは、アプリケーションの残りの部分との一貫性を維持するために、(ユーザーが戻って押したとき)アニメーションの入
builder.setStartAnimations(this, R.anim.slide_in_right, R.anim.slide_out_left);
builder.setExitAnimations(this, R.anim.slide_in_left, R.anim.slide_out_right);ブラウザをウォームアップしてページの読み込みを速くします#
デフォルトでは、
CustomTabsIntent#launchUrl
が呼び出されると、ブラウザがスピンアップしてURLを起動します。 これは、貴重な時間と滑らかさの知覚に影響を与えることができます。私たちは、ユーザーがほぼ瞬時の経験を要求すると信じているので、私たちはあなたのアプリに接続し、ブラウザとそのネイティブコンポーネントにウォームア カスタムタブはまた、ユーザーが訪問するwebページの可能性の高いセットをブラウザに伝えるために、開発者のための機能を提供します。 ブラウザは次のことを実行できます。
- メインドメインのDNS事前解決
- 最も可能性の高いサブリソースのDNS事前解決
- HTTPS/TLSネゴシエーションを含む宛先への事前接続。
CustomTabsClient#bindCustomTabsService
を使用して、サービスに接続します。CustomTabsClient#bindCustomTabsService
- サービスが接続されたら、
CustomTabsClient#warmup
を呼び出して舞台裏でブラウザを起動します。 - 新しいセッションを作成するには、
CustomTabsClient#newSession
を呼び出します。 このセッションは、APIへのすべての要求に使用されます。 - 必要に応じて、新しいセッションを作成するときにパラメータとして
CustomTabsCallback
を添付して、ページがロードされたことを知ることができます。 - ユーザーがロードする可能性のあるページをブラウザに指示します
CustomTabsSession#mayLaunchUrl
CustomTabsIntent.Builder
CustomTabsSession
パラメータとして渡すコンストラクタを呼び出します。
カスタムタブサービスへの接続#
CustomTabsClient#bindCustomTabsService
メソッドは、カスタムタブサービスへの接続の複雑さを取り除きます。p>CustomTabsServiceConnection
onCustomTabsServiceConnected
CustomTabsClient
のインスタンスを取得します。 このインスタンスは、次の手順で必要になります。H2>boolean warmup(long flags)
ブラウザプロセスをウォームアップし、ネイティブライブラリをロードします。 ウォームアップは非同期で、戻り値は要求が受け入れられたかどうかを示します。 複数の呼び出しが成功した場合もtrueが返されます。成功した場合、
true
を返します。新しいタブセッションを作成します#
boolean newSession(CustomTabsCallback callback)
セッションは、mayLaunchUrl呼び出し、CustomTabsIntentと相互に生成されたタブをリンクするための後続の呼 ここで提供されるコールバックは、作成されたセッションに関連付けられます。 作成されたセッションの更新(以下のカスタムタブコールバックを参照)もこのコールバックを介して受信されます。 セッションが正常に作成されたかどうかを返します。 同じCustomTabsCallbackまたはnull値を使用して複数の呼び出しを行うと、falseが返されます。
ユーザーが開く可能性のあるUrlをブラウザに伝えます#
boolean mayLaunchUrl(Uri url, Bundle extras, List<Bundle> otherLikelyBundles)
このCustomTabsSessionメソッドは、URLへの将来のナビゲーションの可能性をブラウ メソッド
warmup()
は、ベストプラクティスとして最初に呼び出す必要があります。 最も可能性の高いURLを最初に指定する必要があります。 必要に応じて、他の可能性のあるUrlのリストを提供することができる。 それらは最初のものよりも可能性が低いとして扱われ、優先順位の低い順序でソートする必要があります。 これらの追加Urlは無視される場合があります。 このメソッドへの以前の呼び出しはすべて剥奪されます。 操作が正常に完了したかどうかを返します。カスタムタブ接続コールバック#
void onNavigationEvent(int navigationEvent, Bundle extras)
カスタムタブでナビゲーションイベントが発生したときに呼び出されます。
navigationEvent int
は、ページの状態を定義する6つの値のいずれかです。 詳細については、以下を参照してください。p>/**
* Sent when the tab has started loading a page.
*/
public static final int NAVIGATION_STARTED = 1;
/**
* Sent when the tab has finished loading a page.
*/
public static final int NAVIGATION_FINISHED = 2;
/**
* Sent when the tab couldn't finish loading due to a failure.
*/
public static final int NAVIGATION_FAILED = 3;
/**
* Sent when loading was aborted by a user action before it finishes like clicking on a link
* or refreshing the page.
*/
public static final int NAVIGATION_ABORTED = 4;
/**
* Sent when the tab becomes visible.
*/
public static final int TAB_SHOWN = 5;
/**
* Sent when the tab becomes hidden.
*/
public static final int TAB_HIDDEN = 6;ユーザーにカスタムタブをサポートするブラウザがインストールされていない場合はどうなりますか? #
カスタムタブは、ほとんどのAndroidブラウザでサポートされています。 それにもかかわらず、UIをカスタマイズするために
ACTION_VIEW
インテントを使用しているため、システムブラウザで開き、カスタムタブがサポートされていない場合はユーザーのデフォルトブラウザで開きます。ユーザーがカスタムタブをサポートするブラウザをインストールしていて、それがデフォルトのブラウザである場合、自動的に追加機能が選択され、カスAndroidデバイスにカスタムタブをサポートするブラウザがあるかどうかを確認するにはどうすればよいですか? #
PackageManager
を使用して、カスタムタブを処理できるアプリケーションをAndroidデバイスに照会することができます。http
インテントを処理できるアプリケーションを照会し、それらのアプリケーションがカスタムタブサービスのサポートも宣言しているかどうかを:P>/**
* Returns a list of packages that support Custom Tabs.
*/
public static ArrayList<ResolveInfo> getCustomTabsPackages(Context context) {
PackageManager pm = context.getPackageManager();
// Get default VIEW intent handler.
Intent activityIntent = new Intent()
.setAction(Intent.ACTION_VIEW)
.addCategory(Intent.CATEGORY_BROWSABLE)
.setData(Uri.fromParts("http", "", null));
// Get all apps that can handle VIEW intents.
List<ResolveInfo> resolvedActivityList = pm.queryIntentActivities(activityIntent, 0);
ArrayList<ResolveInfo> packagesSupportingCustomTabs = new ArrayList<>();
for (ResolveInfo info : resolvedActivityList) {
Intent serviceIntent = new Intent();
serviceIntent.setAction(ACTION_CUSTOM_TABS_CONNECTION);
serviceIntent.setPackage(info.activityInfo.packageName);
// Check if this package also resolves the Custom Tabs service.
if (pm.resolveService(serviceIntent, 0) != null) {
packagesSupportingCustomTabs.add(info);
}
}
return packagesSupportingCustomTabs;
}Android11は、パッケージのvisiblityの変更を導入しました。 AndroidアプリがAPIレベル30以上を対象としている場合は、
queries
AndroidManifest.xml
に追加する必要があります。