无法理解如何在应用程序中打开简单的 TWA(使用 AndroidX)
Cannot understand how to open a simple TWA inside an app (using AndroidX)
我正在尝试在我的应用程序中打开一个 TWA 并研究了 2 天。
我已经成功地创建了一个 TWA 应用程序,不用大惊小怪,只需编辑清单和其他一些东西。
现在我需要拥有自己的应用程序 - 假设应用程序最初有启动画面 activity,然后在应用程序内打开 TWA。
例如,我可以通过一个简单的初始屏幕 activity 在我的应用程序中启动 TWA 吗?
我确实尝试过使用 CustomTabs
方式,但它说它已被弃用并改为使用 TrustedWebActivityIntentBuilder
,但是有 0,我再说一遍,关于如何使用它的零文档!
Android 开发文档太糟糕了。除其他事项外,文档指针已过时。 (在他们的频道上阅读链接到指南的视频,这些指南对 video 本身讨论的内容不再有效)
我找到的最接近的是这个 sample project。这使用了大量已弃用的东西,使该方法适应我的应用程序完全无用。它还利用了专为该项目创建的无数自定义 Classes/Helpers,这让我陷入了一场永无止境的马拉松式复制粘贴,只是为了发现其中还有更多需要被复制到项目中。
经过一如既往的反复试验,我成功地在应用程序中启动了 TWA。请注意,这不像 WebView,它只是在您的应用程序堆栈上启动一个 activity。
以下是我Activity的代码:
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);
}
};
}
我认为有一种更简单的方法。
首先:在 AndroidManifest.xml 中声明您的 TWA activity,如下所示。请注意,默认情况下它不会启动,因为它不处理 android.intent.action.MAIN 意图,因此您可以实现自己的主要 activity.
<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 activity。如果您愿意,也可以在意图中传递站点 url。
Intent intent = new Intent(this, com.google.androidbrowserhelper.trusted.LauncherActivity.class);
intent.setData(Uri.parse("ANOTHER_SITE_URL"));
startActivity(intent);
另请注意在 AndroidX 中使用 TWA 所需的依赖项:
implementation 'androidx.browser:browser:1.0.0'
implementation 'com.github.GoogleChrome:android-browser-helper:ff8dfc4ed3d4133aacc837673c88d090d3628ec8'
从现有 Activity 启动可信 Web Activity 时,推荐的方法是使用 TwaLauncher
,从 android-browser-helper
。这个 use-case 有一个 demo,但实现是:
- 在
build.gradle
中导入 android-browser-helper
:
dependencies {
...
implementation 'com.google.androidbrowserhelper:androidbrowserhelper:2.0.0'
}
- 从 Activity:
启动可信网络 Activity
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
增加了一个额外的间接级别,这将在从现有 Activity 启动可信网络 Activity 时引入延迟(例如: Activity X 启动 LauncherActivity,后者又启动 Trusted Web Activity)。
直接使用 androidx.browser
:这种方法没有任何问题,但是 TwaLauncher
封装了几乎所有需要处理的东西。
我正在尝试在我的应用程序中打开一个 TWA 并研究了 2 天。
我已经成功地创建了一个 TWA 应用程序,不用大惊小怪,只需编辑清单和其他一些东西。
现在我需要拥有自己的应用程序 - 假设应用程序最初有启动画面 activity,然后在应用程序内打开 TWA。 例如,我可以通过一个简单的初始屏幕 activity 在我的应用程序中启动 TWA 吗?
我确实尝试过使用 CustomTabs
方式,但它说它已被弃用并改为使用 TrustedWebActivityIntentBuilder
,但是有 0,我再说一遍,关于如何使用它的零文档!
Android 开发文档太糟糕了。除其他事项外,文档指针已过时。 (在他们的频道上阅读链接到指南的视频,这些指南对 video 本身讨论的内容不再有效)
我找到的最接近的是这个 sample project。这使用了大量已弃用的东西,使该方法适应我的应用程序完全无用。它还利用了专为该项目创建的无数自定义 Classes/Helpers,这让我陷入了一场永无止境的马拉松式复制粘贴,只是为了发现其中还有更多需要被复制到项目中。
经过一如既往的反复试验,我成功地在应用程序中启动了 TWA。请注意,这不像 WebView,它只是在您的应用程序堆栈上启动一个 activity。
以下是我Activity的代码:
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);
}
};
}
我认为有一种更简单的方法。
首先:在 AndroidManifest.xml 中声明您的 TWA activity,如下所示。请注意,默认情况下它不会启动,因为它不处理 android.intent.action.MAIN 意图,因此您可以实现自己的主要 activity.
<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 activity。如果您愿意,也可以在意图中传递站点 url。
Intent intent = new Intent(this, com.google.androidbrowserhelper.trusted.LauncherActivity.class);
intent.setData(Uri.parse("ANOTHER_SITE_URL"));
startActivity(intent);
另请注意在 AndroidX 中使用 TWA 所需的依赖项:
implementation 'androidx.browser:browser:1.0.0'
implementation 'com.github.GoogleChrome:android-browser-helper:ff8dfc4ed3d4133aacc837673c88d090d3628ec8'
从现有 Activity 启动可信 Web Activity 时,推荐的方法是使用 TwaLauncher
,从 android-browser-helper
。这个 use-case 有一个 demo,但实现是:
- 在
build.gradle
中导入android-browser-helper
:
dependencies {
...
implementation 'com.google.androidbrowserhelper:androidbrowserhelper:2.0.0'
}
- 从 Activity: 启动可信网络 Activity
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
增加了一个额外的间接级别,这将在从现有 Activity 启动可信网络 Activity 时引入延迟(例如: Activity X 启动 LauncherActivity,后者又启动 Trusted Web Activity)。
直接使用 androidx.browser
:这种方法没有任何问题,但是 TwaLauncher
封装了几乎所有需要处理的东西。