我正在尝试在我的应用程序中打开TWA,并且已经研究了2天。
我已经设法创建了一个TWA应用程序,没有大惊小怪,只需编辑清单和更多内容即可。
现在我需要拥有自己的应用 - 假设应用首先有一个初始屏幕活动,然后在应用内打开 TWA。 例如,我能否通过简单的初始屏幕活动在应用内启动 TWA?
我确实尝试使用CustomTabs
方式,但它说它已被弃用并改用TrustedWebActivityIntentBuilder
,但我再说一遍,关于如何使用它的文档为 0
!Android开发文档很糟糕。除此之外,文档指针已过时。(阅读其频道上的视频,这些视频链接到对视频本身中讨论的内容不再有效的指南(
我发现的最接近的东西是这个示例项目。这使用了数量惊人的弃用内容,使得该方法适应我的应用程序完全无用。它还利用了为该项目创建的无数自定义类/助手,导致我进行永无止境的马拉松式复制粘贴每个类/帮助程序,只是为了发现在该类中还有更多需要复制到项目中。
在我看来,有一种更简单的方法。
首先:在 AndroidManifest 中声明您的 TWA 活动.xml如下所示。请注意,默认情况下它不会启动,因为它不处理 android.intent.action.MAIN 意图,因此您可以实现自己的 main 活动。
<activity
android:name="com.google.androidbrowserhelper.trusted.LauncherActivity">
<!-- Edit android:value to change the url opened by the TWA -->
<meta-data
android:name="android.support.customtabs.trusted.DEFAULT_URL"
android:value="https://YOUR_SITE_URL" />
<!--
This intent-filter allows the TWA to handle Intents to open
YOUR_SITE_URL
-->
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE"/>
<!-- Edit android:host to handle links to the target URL-->
<data
android:scheme="https"
android:host="YOUR_SITE_URL"/>
</intent-filter>
</activity>
第二:在代码中的某个地方启动 TWA 活动,其意图如下。如果您愿意,您还可以在意图中传递站点 URL。
Intent intent = new Intent(this, com.google.androidbrowserhelper.trusted.LauncherActivity.class);
intent.setData(Uri.parse("ANOTHER_SITE_URL"));
startActivity(intent);
另请注意将 TWA 与 AndroidX 配合使用所需的依赖项:
implementation 'androidx.browser:browser:1.0.0'
implementation 'com.github.GoogleChrome:android-browser-helper:ff8dfc4ed3d4133aacc837673c88d090d3628ec8'
从现有活动启动受信任的 Web 活动时,建议的方法是使用TwaLauncher
, fromandroid-browser-helper
。这个用例有一个演示,但实现将是:
build.gradle
中的导入android-browser-helper
:
dependencies {
...
implementation 'com.google.androidbrowserhelper:androidbrowserhelper:2.0.0'
}
- 从活动启动受信任的 Web 活动:
public void launchTwa(Uri uri) {
TrustedWebActivityIntentBuilder builder = new TrustedWebActivityIntentBuilder(uri)
.setNavigationBarColor(Color.RED) // Use the builder to customise.
.setToolbarColor(Color.BLUE);
TwaLauncher launcher = new TwaLauncher(this);
launcher.launch(builder, null, null);
}
与其他方法相比:
使用LauncherActivity
:使用LauncherActivity
会增加额外的间接级别,这将在从现有活动启动受信任的 Web 活动时引入延迟(例如:活动 X 启动启动器活动,进而启动受信任的 Web 活动(。
直接使用androidx.browser
:这种方法没有错,但TwaLauncher
已经封装了处理它所需的几乎所有内容。
经过一如既往的大量试验和错误,我设法在应用程序内启动了TWA。 请注意,这不像 WebView,它只是在应用程序的堆栈上启动活动。
以下是我的活动代码:
final static String PACKAGE_NAME = "com.android.chrome";
final static String BASE_URL = "https://your.website.com";
CustomTabsClient mClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launcher);
CustomTabsClient.bindCustomTabsService(this, PACKAGE_NAME, getConnection(BASE_URL));
}
private CustomTabsServiceConnection getConnection(final String url) {
return new CustomTabsServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName componentName) {
mClient = null;
}
@Override
public void onCustomTabsServiceConnected(
ComponentName name,
CustomTabsClient client
) {
final Intent intent;
final CustomTabsSession customTabsSession;
final TrustedWebActivityIntentBuilder intentBuilder;
mClient = client;
mClient.warmup(0);
if ((customTabsSession = mClient.newSession(new CustomTabsCallback())) == null) {
return;
}
intentBuilder = new TrustedWebActivityIntentBuilder(Uri.parse(url))
.setToolbarColor(Color.parseColor("#ffffff"))
.setNavigationBarColor(Color.parseColor("#ffffff"));
intent = intentBuilder.build(customTabsSession);
startActivity(intent);
}
};
}