Android N giới thiệu nhiều tính năng mới rất mạnh mẽ, hôm nay tôi sẽ nói về một thứ rất đơn giản, nhưng lại rất hữu ích. App Shortcuts
Sẵn sàng từ Android API Version 25, App Shortcuts giúp cho người dùng thực hiện hành động cụ thể bên trong App từ bên ngoài App.

Thực hiện long tap trên icon launch của app sẽ hiển thị list của App Shortcuts và mỗi trong số chúng có thể được HomeScreen như là những icon app riêng biệt như hình bên dưới.

Android cung cấp 2 loại App Shortcuts.

1. Static Shortcuts

Static Shortcuts được phát hành App đã được cài đặt do vậy chúng luôn tồn tại trong app. Static Shortcuts không thể thay đổi có nghĩa rằng icon, description và Intent nó chứa sẽ không bao giờ được thay đổi
nếu không có update version mới của app tức là cài lại app.
Static Shortcuts được sử dụng cho những action chung chung của app mà vẫn tồn tại liên tục trong suốt phiên bản hiện tại của ứng dụng.

2. Dynamic Shortcuts

Dynamic Shortcuts là được tạo, cập nhật or remote trong quá trình chạy của App.
Dynamic Shortcuts được sủ dụng để cung cấp những action cụ thể, nhưng action trong những ngữ cảnh cụ thể bên trong app mà có thể thay đổi với người dùng hoặc dựa trên
tương tác của người dùng bên trong app

Thực hiện App Shortcuts

Static Shortcuts
Để định nghĩa Static Shortcuts tạo một file resrouce bên dưới res/xml với tên tuỳ ý, trong ví dụ này tôi gọi là shortcuts.xml và định nghĩa tất cả những shortcuts của app có icon,
description và Intent khởi động bên trong app.

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">

    <shortcut
        android:shortcutId="open_cart"
        android:enabled="true"
        android:icon="@drawable/shopping_cart"
        android:shortcutShortLabel="@string/open_cart_short_label"
        android:shortcutLongLabel="@string/open_cart_long_label"
        android:shortcutDisabledMessage="@string/disabled_message">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetPackage="com.thaibaodigital.app_shortcuts"
            android:targetClass="com.thaibaodigital.app_shortcuts.MainActivity">
            <extra android:name="fragment" android:value="cart"/>
        </intent>
    </shortcut>

    <shortcut
        android:shortcutId="all_categories"
        android:enabled="true"
        android:icon="@drawable/categories"
        android:shortcutShortLabel="@string/all_categories_short_label"
        android:shortcutLongLabel="@string/all_categories_long_label"
        android:shortcutDisabledMessage="@string/disabled_message">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetPackage="com.thaibaodigital.app_shortcuts"
            android:targetClass="com.thaibaodigital.app_shortcuts.MainActivity">
            <extra android:name="fragment" android:value="categories"/>
        </intent>
    </shortcut>

</shortcuts>

Add meta-data tag tới Activity Launcher trong manifest và cung câp file shortcuts resource.

<activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="android.app.shortcuts"
                android:resource="@xml/shortcuts"/>
        </activity>

Nếu bạn có nhiều shortcuts thực hiện cùng một Actvity, để phân biệt những action khác nhau cần được thực hiện , định nghĩa extra cho Intent trong shortcuts.xml và kiểm tra giá trị này trong Activity của bạn.

<intent
            android:action="android.intent.action.VIEW"
            android:targetPackage="com.thaibaodigital.app_shortcuts"
            android:targetClass="com.thaibaodigital.app_shortcuts.MainActivity">
            <extra android:name="fragment" android:value="cart"/>
        </intent>

Dynamic Shortcuts

ShortcutManager cung cấp những method cho to publish, update and remove shortcuts tự động. Mỗi shortcuts có thể được định nghĩa sử dụng ShortcutInfo
cái này cung cấp thông tin UI cho shortcut

ShortcutManager manager = getSystemService(ShortcutManager.class);
ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "cartId")
    .setShortLabel("My Cart")
    .setLongLabel("Open shopping cart")
    .setIcon(Icon.createWithResource(context, R.drawable.cart))
    .setIntent(new Intent(context, CartActivity.class))
    .build();
shortcutManager.setDynamicShortcuts(Arrays.asList(shortcut));

setDynamicShortcuts dùng để update toàn bộ list của Dynamic Shortcuts. Nếu bạn chỉ muốn add một thành phần khác tới list đã tồn tại sử dụng addDynamicShortcuts(). Để update một Dynamic Shortcut sử dụng method updateShortcuts()

Chuyển Hướng Người Dùng
Khi người dùng khởi động app thông qua một app shortcut và sau đó quyết định nhấn nút back sau đó app có thể đóng đột ngột. Để tránh điều này và tạo cảm giác chuyển hướng thân thiện cho người dùng và duy trì người dùng trong app bạn có thể khởi động nhiều Intent (theo thứ tự cái sau cùng sẽ ở trên top ) cho cả Static và Dynamic Shortcuts.
Cho Static shortcuts nhiều Intent có thể được định nghĩa trong shortcuts.xml

<shortcut
    android:shortcutId="open_cart"
    android:enabled="true"
    android:icon="@drawable/cart_icon"
    android:shortcutShortLabel="@string/short_label"
    android:shortcutLongLabel="@string/long_label"
    android:shortcutDisabledMessage="@string/disabled_message">
    <intent
      android:action="android.intent.action.VIEW"
      android:targetPackage="com.example.shortcuts"
      android:targetClass="com.example.shortcuts.MainActivity"/>
    <intent
      android:action="android.intent.action.VIEW"
      android:targetPackage="com.example.shortcuts"
      android:targetClass="com.example.shortcuts.CartActivity"/>
</shortcut>

Intent đầu tiên sẽ luôn được set các FLAG : FLAG_ACTIVITY_NEW_TASK and FLAG_ACTIVITY_CLEAR_TASK. điều này có nghĩa rằng những activity đang tồn tại sẽ bị destroy khi Static Shortcut được khởi động.

ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "cartId")
    .setShortLabel("My Cart")
    .setLongLabel("Open shopping cart")
    .setIcon(Icon.createWithResource(context, R.drawable.cart))
    .setIntents(new Intent[] {
                   new Intent(context, MainActivity.class)
                       .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK),
                   new Intent(context, CartActivity.class)
                   })
    .build();

Thường FLAG_ACTIVITY_CLEAR_TASK được định nghĩa để Activity mới sẽ được mang tới front
OK. That's it. Các bạn có thể tham khảo chi tiết code Tại Đây