最好的免安装应用体验专注于帮助用户快速完成任务(例如观看视频或进行购买).您可以开始使用此应用程序列表来准备Android免安装应用。这里的许多考虑被认为是Android应用程序的最佳做法.

从你的应用里删除无用的体积


去除所有的未知或未使用的权限,未使用的组件,不必要的第三方依赖关系和库。删除这些items可以显着减少应用程序的大小,并显着提高性能。

支持Android 应用Links


Android免安装应用对所有的导航都使用 URLs. 当用户点击您免安装应用的链接时,他们会转到您应用中的特定Activity. 如果链接失败或用户在不支持的设备上点击链接,浏览器将打开并显示你的网站. 此外,在免安装应用上activity无法直接启动另一个activity; 相反,它必须请求与该activity相对应的URL地址。

在你的免安装和可安装版本的应用上都必须实现Android 6.0中引入的Android 应用 Links功能。App Links提供了将URL连接到应用程序中的离散的activities的主要机制。建议你的应用支持www和非www域。要使用APP Links,请查看 Handling Android App Links.

此外,免安装应用无法直接在另一个功能中打开activity;相反,它必须请求与另一个其他功能的activity入口点相对应的URL地址。有关详细信息,请查看 Implement app links.

如有必要,重新构建你的应用程序


Android免安装应用需要模块结构化为4MB大小的URL-addressable 。对于应用程序大于4MB的,开发者必须将应用程序重构为更小的模块,可以根据URL导航独立下载和运行。开发者可以自由选择每个模块中包含的内容
,但建议将不同的用户流程隔离成不同的模块。这在流程中提供了快速和响应的体验,并且仅当用户切换流程时才下载附加模块。例如,在构建零售体验时,您可以将应用程序分为四个模块:浏览,搜索,项目详细信息和结帐,以允许用户根据需要在整个采购流程中下载模块。.

从Android 6.0开始,实现运行时权限


Android免安装应用需要使用Android 6.0中引入的运行时权限runtime permissions(API级别23)。Android免安装应用框架可确保这些功能在早期版本的Android上正常工作。因此,请确保您的应用程序的目标是Android 6.0+,并使用运行时权限。

有关如何更新应用程序以使用Android 6.0权限以及如何在运行时请求权限的更多信息,请查看 Requesting Permissions at Run Time.


对于包含登录的免安装应用程序,开发人员必须集成Smart Lock(密码专用)。该功能允许用户使用其保存的凭据快速而安全的登录,并且在每次访问应用时保持登录状态。

有关如何在您的应用程序中实现 Smart Lock, 请查看 Smart Lock for Passwords on Android.

接受使用Google 支付 API付款

为了接受付款,Android免安装应用与实际商品和服务的Google Payment API兼容。

实现Google 支付 API

PAYMENT_GATEWAY

即使 Google 支付 API跟 Android Pay非常相似,这里有一些区别仍然需要记住:

@Override
public void onClick(View view) {
    MaskedWalletRequest request = createMaskedWalletRequest(cartTotal);
    Wallet.Payments.loadMaskedWallet(mGoogleApiClient, request,
        REQUEST_CODE_MASKED_WALLET);
}

private MaskedWalletRequest createMaskedWalletRequest(String cartTotal) {

    // This creates parameters needed to work with the Stripe payment
    // processors. It is always best to check with your payment processor
    // (including stripe) to get the configuration that is required.
    //
    // Also note that PAYMENT_GATEWAY is required for the payment API and
    // the other option of NETWORK_TOKEN is not supported.
    PaymentMethodTokenizationParameters params =
            PaymentMethodTokenizationParameters.newBuilder()
                .setPaymentMethodTokenizationType(
                     PaymentMethodTokenizationType.PAYMENT_GATEWAY)
                .addParameter(“gateway”, “stripe”)
                .addParameter(“stripe:publishableKey”, KEY)
                .addParameter(“stripe:version”, version)
                .build();

    // Convert our cart to a list of LineItem that is used to build
    // the MaskedWalletRequest. Note: Implementation not shown.
    List<LineItem> lineItems = buildLineItems();

    MaskedWalletRequest request = MaskedWalletRequest.newBuilder()
        .setMerchantName(YOUR_NAME_HERE)
        .setPhoneNumberRequired(true)
        .setShippingAddressRequired(true)
        .setCurrencyCode(“USD”)
        .setEstimatedTotalPrice(cartTotal)
        .setCart(Cart.newBuilder()
                     .setCurrencyCode(“USD”)
                     .setTotalPrice(cartTotal)
                     .setLineItems(lineItems)
                     .build())
        .setPaymentMethodTokenizationParameters(params)
        .build();
    return request;
}

更多关于实现 Android Pay的信息,请查看 Android Pay developers site.

为你的应用定义一个入口点

以下代码片段显示了一个Android清单,它定义了免安装应用的入门点activity和默认网址。

<activity
  android:name=".MainActivity">
    <intent-filter>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter android:autoVerify="true">
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />
      <data android:scheme="http" />
      <data android:scheme="https" />
      <data android:host="example.com" />
    </intent-filter>
    <meta-data
      android:name="default-url"
      android:value="https://www.example.com/index.html" />
</activity>