Jetpacker
首发于Jetpacker
Navigation(四)DeepLink的使用

Navigation(四)DeepLink的使用

Navigation组件提供了对深层链接(DeepLink)的支持。通过该特性,我们可以利用PendingIntent或者一个真实的URL链接,直接跳转到应用程序的某个destination(Fragment/Activity)。

最常见的两种使用场景:

1.PendingIntent的方式。当你的应用程序收到某个通知推送,你希望用户在点击该通知时,能够直接跳转到展示该通知内容的页面,那么就可以通过PendingIntent来完成此操作。

2.URL的方式。当用户在手机Web页面上浏览我们网站上的某个页面时,我们可以在网页上放置一个类似“在应用内打开”的按钮。当用户的手机安装有你的应用程序,通过deepLink就能打开相应的页面,如果没有安装,那么我们的网站可以导航到应用程序的下载页面,从而引导用户安装应用程序。

下面举例来说明这两种情况的使用方式:

1.PendingIntent

通过sendNotification()方法,向通知栏发送一条通知,发送通知的时候需要设置PendingIntent

/**
 * 向通知栏发送一个通知
 * */
private void sendNotification()
{
    if(getActivity() == null)
    {
        return;
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
    {
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "ChannelName", importance);
        channel.setDescription("description");
        NotificationManager notificationManager = getActivity().getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
    }

    NotificationCompat.Builder builder = new NotificationCompat.Builder(getActivity(), CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_launcher_foreground)
            .setContentTitle("DeepLinkDemo")
            .setContentText("Hello World!")
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .setContentIntent(getPendingIntent())//设置PendingIntent
            .setAutoCancel(true);

    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(getActivity());
    notificationManager.notify(notificationId, builder.build());
}

构建一个PendingIntent对象,在其中设置,当通知被点击后需要跳转到的destination及传递的参数。

/**
 * 通过PendingIntent设置,当通知被点击后需要跳转到哪个destination,以及传递的参数
 * */
private PendingIntent getPendingIntent()
{
    if(getActivity() != null)
    {
        Bundle bundle = new Bundle();
        bundle.putString("params", "from Notification");
        return Navigation
                .findNavController(getActivity(), R.id.sendNotification)
                .createDeepLink()
                .setGraph(R.navigation.graph_deep_link_activity)
                .setDestination(R.id.deepLinkSettingsFragment)
                .setArguments(bundle)
                .createPendingIntent();
    }
    return null;
}

2.URL

这种方式也很简单。

第一步:在导航图中为destination添加<deepLink/>标签。

注意: app:uri属性中填入的是你的网站的相应web页面地址,后方的参数会通过Bundle对象传递到destination中
<fragment
    android:id="@+id/deepLinkSettingsFragment"
    android:name="com.michael.deeplinkdemo.DeepLinkSettingsFragment"
    android:label="fragment_deep_link_settings"
    tools:layout="@layout/fragment_deep_link_settings">

    <!-- 为destination添加<deepLink/>标签 -->
    <deepLink app:uri="www.YourWebsite.com/{params}" />

</fragment>

第二步:为相应的Activity设置<nav-graph/>标签,这样,当用户在Web中访问到你的网站时,你的应用程序便能监听到

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".DeepLinkActivity">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>

        <!-- 为Activity设置<nav-graph/>标签 -->
        <nav-graph android:value="@navigation/graph_deep_link_activity" />

    </activity>

</application>

第三步:测试

我们可以在Google app中输入相应的Web地址,也可以通过adb工具,使用命令行来完成操作

adb shell am start -a android.intent.action.VIEW -d "http://www.YourWebsite.com/fromWeb"

执行该命令,你的手机便能直接打开deepLinkSettingsFragment。在该Fragment中,我们可以通过Bundle对象获取相应的参数(fromWeb),从而完成后续的操作。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View view = inflater.inflate(R.layout.fragment_deep_link_settings, container, false);
    Bundle bundle = getArguments();
    if(bundle != null)
    {
        String params = bundle.getString("params");
        TextView tvDesc = view.findViewById(R.id.tvDesc);
        if(!TextUtils.isEmpty(params))
        {
            tvDesc.setText(params);
        }
    }
    return view;
}

下面是项目的演示动画和代码仓库:


michaelye/DeepLinkDemogithub.com图标

发布于 2019-06-18

文章被以下专栏收录