最好的免安装应用体验专注于帮助用户快速完成任务(例如观看视频或进行购买).您可以开始使用此应用程序列表来准备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>