21
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Chrome Custom Tabs を試してみる -プリフェッチ編-

Posted at

DroidKaigi 2016アプリでも使われており注目を集めていると思われるChrome Custom Tabsですが、
デベロッパページにあるような高速でWebページを表示しいたい場合、単純にCustomTabsIntent使うだけではこのようになりません。

image

今回の記事は、高速化のためにCustom Tabsでプリフェッチをする方法についてです。
Chrome Custom Tabsの基本的な使い方については前回の記事をご参照下さい。

確認用のサンプルはGitHubにあります。

プリフェッチの方法

プリフェッチする方法はデベロッパーページに載っています。

デベロッパーページのように自前でChrome Custom Tabsが提供するクラスを使ってプリフェッチすることができますが、今回は手っ取り早く実現するために公式が提供しているプロジェクトにあるユーティリティを使用します。

詳細を理解したいという方は、ユーティリティクラスのソースコードを合わせて読むと理解しやすいかもしれません。

ユーティリティはサポートライブラリとして提供されていないので、今回はファイルをコピーして使わせてもらっています。コピーするファイルは次のとおりです。

  • demo
    • CustomTabActivityHelper.java
  • share
    • CustomTabsHelper.java
    • KeepAliveService.java
    • ServiceConnection.java
    • ServiceConnectionCallback.java

主に使用するのは CustomTabActivityHelper クラスになります。

セットアップの流れ

プリフェッチするための事前準備のおおまかな流れは次のようになります。

  1. Custom Tabs Serviceに接続
  2. Serviceにプリフェッチ対象のURLを指定
  3. CustomTabsIntent生成時にセッションを指定して起動

Custom Tabs Serviceに接続

public class MainFragment extends Fragment implements CustomTabActivityHelper.ConnectionCallback {

    private static final String sDevPageUrl = "https://developer.chrome.com/multidevice/android/customtabs";

	private CustomTabActivityHelper mCustomTabActivityHelper;
	
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        
        // サービスに接続された時に呼ばれるコールバックを設定する。
        mCustomTabActivityHelper = new CustomTabActivityHelper();
        mCustomTabActivityHelper.setConnectionCallback(this);
    }
    
    @Override
    public void onStart() {
        super.onStart();
        // Custom Tabs Serviceに接続する。
        mCustomTabActivityHelper.bindCustomTabsService(getActivity());
    }
    
    @Override
    public void onStop() {
        super.onStop();

		 // 切断はonStartと対になるonStopがいいと思われます。
        mCustomTabActivityHelper.unbindCustomTabsService(getActivity());
    }    
}

onStart のタイミングで接続するのはデベロッパーページの Best Practices に記載があるためです。
他にも情報がありますので一度ご覧になるといいと思います。

Serviceにプリフェッチ対象のURLを指定

@Override
 public void onCustomTabsConnected() {
     Uri uri = Uri.parse(sDevPageUrl);
     if (mCustomTabActivityHelper.mayLaunchUrl(uri, null, null)) {
         Toast.makeText(getContext(), "Connected custom tabs service, and warm up OK.", Toast.LENGTH_SHORT).show();
     }
 }

CustomTabsIntent生成時にセッションを指定して起動

private void showDeveloperPage() {
	CustomTabsSession sesstion = mCustomTabActivityHelper.getSession();
	CustomTabsIntent tabsIntent = new CustomTabsIntent.Builder(session)
			// 省略
			.build()

	// アクティビティの起動。
	Uri uri = Uri.parse(sDevPageUrl);
	CustomTabActivityHelper.openCustomTab(getActivity(), tabsIntent, uri, null);			
}

Activityの起動には CustomTabActivityHelper.openCustomTab() を使うこともできます。
CustomTabsIntent#launchUrl() とは違い、このメソッドは第4引数にCustom Tabsが有効ではない用のコールバックを指定することができます。

サポートライブラリをそのまま使うと結構大変なのですが、 CustomTabActivityHelper を使用することで
とても簡単にプリフェッチすることができます。

実際にChrome Custom TabsのデベロッパーページをCustom Tabsで表示してみます。
(1度目の表示はプリフェッチなし、2度目の表示はプリフェッチあり)

Imgur

プリフェッチが効いている2度目の表示はかなり高速化されています。

以上、簡単ですがCustom Tabsでプリフェッチする方法でした。

21
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?