LoginSignup
20
14

More than 5 years have passed since last update.

DeepLinkDispatchで手軽にAndroidのディープリンクを実装する

Posted at

Androidアプリにディープリンクを簡単に組み込めるオープンソースライブラリです。Airbnbが公開しています。

使い方

APIは超簡単なので、大体公式のREADME見ればわかります。以下ほとんどただの意訳です^^;

基本

ディープリンクを張りたいActivityに、アノテーションを付けます。あとはonCreateの中で渡ってくるパラメータを受け取るだけ。

@DeepLink("foo://example.com/deepLink/{id}")
public class MainActivity extends AppCompatActivity {

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

        if (getIntent().getBooleanExtra(DeepLink.IS_DEEP_LINK, false)) {
            Bundle parameters = getIntent().getExtras();

            String idString = parameters.getString("id");

            // Do something with the ID...
            Log.v("main", "id = " + idString);
        }
    }
}

これでビルド時にDeepLinkActivityというActivityが自動生成されます。なので、AndroidManifest.xmlに以下を追記しときます。

<activity
    android:name="com.airbnb.deeplinkdispatch.DeepLinkActivity"
    android:theme="@android:style/Theme.NoDisplay">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- スキームはアプリで決める -->
        <data android:scheme="foo" />
    </intent-filter>
</activity>

ひとつのActivityに複数のディープリンクを張りたい

@DeepLinkの中に複数渡すだけ

@DeepLink({"foo://example.com/deepLink/{id}", "foo://example.com/anotherDeepLink"})
public class MainActivity extends Activity {
  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getIntent().getBooleanExtra(DeepLink.IS_DEEP_LINK, false)) {
      Bundle parameters = getIntent().getExtras();

      String idString = parameters.getString("id");

      // Do something with the ID...
    }
    ...
  }
}

Activityを起動するIntentを指定する

Method annotationを使えばできます。使いドコロは、IntentのActionを指定したり、フラグをつけたりするとか?

@DeepLink("foo://example.com/methodDeepLink/{param1}")
public static Intent intentForDeepLinkMethod(Context context) {
  return new Intent(context, MainActivity.class).setAction(ACTION_DEEP_LINK_METHOD);
}

ディープリンクが発行されたときにコールバックを受け取る

DeepLinkActivityはディープリンクによってActivityが起動できたかどうかをIntentでブロードキャストしているので、BroadcastReceiverを用意すれば受け取れます。

public class DeepLinkReceiver extends BroadcastReceiver {
  private static final String TAG = DeepLinkReceiver.class.getSimpleName();

  @Override
  public void onReceive(Context context, Intent intent) {
    String deepLinkUri = intent.getStringExtra(DeepLinkActivity.EXTRA_URI);

    if (intent.getBooleanExtra(DeepLinkActivity.EXTRA_SUCCESSFUL, false)) {
      Log.i(TAG, "Success deep linking: " + deepLinkUri);
    } else {
      String errorMessage = intent.getStringExtra(DeepLinkActivity.EXTRA_ERROR_MESSAGE);
      Log.e(TAG, "Error deep linking: " + deepLinkUri + " with error message +" + errorMessage);
    }
  }
}

public class YourApplication extends Application {
  @Override public void onCreate() {
    super.onCreate();
    IntentFilter intentFilter = new IntentFilter(DeepLinkActivity.ACTION);
    LocalBroadcastManager.getInstance(this).registerReceiver(new DeepLinkReceiver(), intentFilter);
  }
}

おまけ:生成されるコード

DeepLinkActivity

実際にディープリンクによって起動されるActivity。こいつが下記のDeepLinkLoaderを使ってURIをパースして、合致するActivityを起動している。Intentのブロードキャストもこいつが行う。最後にはfinishするので、ユーザーには見えない。

Method annotationによる起動時はリフレクションを使っているので、proguard必須。

DeepLinkLoader

どのURIがどのActivity(やそのメソッド)に対応するかを判定するクラス

20
14
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
20
14