- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当通过 Android Studio 运行配置在动态功能模块中键入启动 Activity
时,我收到以下警告:The activity 'SomeActivity' is not declared in AndroidManifest.xml
。(因为它是在动态功能模块的 AndroidManifest.xml
中声明的)。作为引用,这是正在使用的库:
// https://developer.android.com/guide/app-bundle/playcore
api "com.google.android.play:core:1.6.4"
运行配置显示并部署了两个模块,但它只识别基本模块 AndroidManifest.xml
中的 Activity 。 如何在动态功能模块中启动 Activity?
旁注:尝试安装已部署的功能模块时,它似乎没有安装:
I/PlayCore: SplitInstallListenerRegistry : registerListener
I/PlayCore: SplitInstallInfoProvider : No metadata found in AndroidManifest.
I/PlayCore: SplitInstallService : startInstall([feature_module],[])
I/PlayCore: SplitInstallService : Initiate binding to the service.
I/PlayCore: SplitInstallService : ServiceConnectionImpl.onServiceConnected(ComponentInfo{com.android.vending/com.google.android.finsky.splitinstallservice.SplitInstallService})
I/PlayCore: SplitInstallService : linkToDeath
I/PlayCore: SplitInstallService : onError(-5)
I/PlayCore: SplitInstallService : Unbind from service.
-5
表示 SplitInstallErrorCode.API_NOT_AVAILABLE
(可能是因为它是调试版本);尽管如此,getInstalledModules()
应该找到已部署的功能模块……但它没有。 SplitInstallInfoProvider:在 AndroidManifest 中找不到元数据
似乎是这个 issue - 当部署“默认 APK”而不是“应用程序包中的 APK”时,将安装功能模块。
最佳答案
由于无法在基本模块的 AndroidManifest.xml
中引用功能模块 Activity ,我写了一个 SplitInstallActivity
, 它位于 debug
基本模块的源集,它也可用于测试。可以使用传递启动标志的运行配置调用它:
-e "moduleName" "feature_module" -e "className" "com.acme.feature.SomeActivity"
它要么通过 moduleName
安装功能模块和/或启动 Activity
通过 className
.
这至少在部署“默认 APK”而不是“来自应用程序包的 APK”时有效。
ArgumentKeys.java
public class ArgumentKeys {
/** {@link SplitInstallActivity} dynamic features, the module name */
public static final String ARGUMENT_FEATURE_MODULE_MODULE_NAME = "moduleName";
/** {@link SplitInstallActivity} dynamic features, the activity class name to launch */
public static final String ARGUMENT_FEATURE_MODULE_CLASS_NAME = "className";
}
SplitInstallActivity.java
/**
* Split-Install {@link AppCompatActivity}.
* @author Martin Zeitler
**/
public class SplitInstallActivity extends AppCompatActivity implements SplitInstallStateUpdatedListener {
private static final String LOG_TAG = SplitInstallActivity.class.getSimpleName();
private SplitInstallRequest request;
private SplitInstallManager sim;
private String moduleName;
private String className;
public SplitInstallActivity() {}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* instance the {@link SplitInstallManager}: */
this.sim = SplitInstallManagerFactory.create(this.getApplicationContext());
/* obtain the feature module & class name from arguments */
if(this.getIntent() != null) {
Bundle extras = this.getIntent().getExtras();
if(extras != null) {
this.moduleName = extras.getString(ArgumentKeys.ARGUMENT_FEATURE_MODULE_MODULE_NAME);
this.className = extras.getString(ArgumentKeys.ARGUMENT_FEATURE_MODULE_CLASS_NAME);
if(this.moduleName != null && this.className != null) {
this.startFeatureActivity(this.moduleName, this.className);
} else {
Log.e(LOG_TAG, "module and class are required.");
}
}
}
}
/** it listens for the split-install session state */
@Override
public void onStateUpdate(SplitInstallSessionState state) {
if(state.errorCode() == SplitInstallErrorCode.NO_ERROR && state.status() == SplitInstallSessionStatus.INSTALLED) {
Log.d(LOG_TAG, "dynamic feature " + this.moduleName + " had been installed.");
this.startFeatureActivity(this.moduleName, this.className);
} else {
// this.OnSplitInstallStatus(state);
}
}
/** it checks if the dynamic feature module is installed and then either installs it - or starts the desired activity */
private void startFeatureActivity(@NonNull String moduleName, @NonNull String className) {
if (this.sim.getInstalledModules().contains(moduleName)) {
Log.d(LOG_TAG, "dynamic feature module " + moduleName + " already installed.");
Intent intent = this.getIntent();
intent.setClassName(BuildConfig.APPLICATION_ID, className);
this.startActivity(intent);
this.finish();
} else {
Log.d(LOG_TAG, "dynamic feature module " + moduleName + " is not installed.");
this.installFeatureModule(moduleName);
}
}
/** it installs a dynamic feature module on demand */
private void installFeatureModule(@NonNull String moduleName) {
Log.d(LOG_TAG, "dynamic feature module " + moduleName + " will be installed.");
this.request = SplitInstallRequest.newBuilder().addModule(moduleName).build();
this.sim.registerListener(this);
this.sim.startInstall(this.request);
}
...
}
具体的推出Activity
可以用 ActivityTestRule<?>
自动化:
@Rule
public ActivityTestRule<SplitInstallActivity> mRule = new ActivityTestRule<SplitInstallActivity>(SplitInstallActivity.class) {
@Override
protected Intent getActivityIntent() {
Intent intent = new Intent();
Bundle extras = new Bundle();
extras.putString(ArgumentKeys.ARGUMENT_FEATURE_MODULE_MODULE_NAME, "feature_module");
extras.putString(ArgumentKeys.ARGUMENT_FEATURE_MODULE_CLASS_NAME, "com.acme.feature.SomeActivity");
intent.putExtras(extras);
return intent;
}
};
为了测试,必须在功能模块的 build.gradle
中提供这些依赖项:
androidTestDebugImplementation "com.google.android.gms:play-services-basement:17.1.1"
androidTestDebugImplementation "com.google.android.play:core:1.6.4"
否则它无法链接测试应用程序的资源并失败:
> Task :feature_module:processDebugAndroidTestResources FAILED
AGPBI: {"kind":"error","text":"Android resource linking failed","sources":[{"file":"/home/user/.gradle/caches/transforms-2/files-2.1/7435b27a13269cffdd35a7dd69f0b9d2/core-1.6.4/AndroidManifest.xml","position":{"startLine":8,"startColumn":4,"endColumn":277}}],"original":"/home/user/.gradle/caches/transforms-2/files-2.1/7435b27a13269cffdd35a7dd69f0b9d2/core-1.6.4/AndroidManifest.xml:9:5-278: AAPT: error: resource style/Theme.PlayCore.Transparent (aka com.acme.feature.test:style/Theme.PlayCore.Transparent) not found.","tool":"AAPT"}
AGPBI: {"kind":"error","text":"Android resource linking failed","sources":[{"file":"/home/user/.gradle/caches/transforms-2/files-2.1/c1b8b45e2f49fbe83ea45d80000bd6e9/jetified-play-services-basement-17.0.0/AndroidManifest.xml","position":{"startLine":22,"startColumn":8,"endLine":24,"endColumn":68}}],"original":"/home/user/.gradle/caches/transforms-2/files-2.1/c1b8b45e2f49fbe83ea45d80000bd6e9/jetified-play-services-basement-17.0.0/AndroidManifest.xml:23:9-25:69: AAPT: error: resource integer/google_play_services_version (aka com.acme.feature.test:integer/google_play_services_version) not found.","tool":"AAPT"}
为了测试,还有:
关于android - 如何在动态特性模块中启动一个Activity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58611149/
每当我运行命令以将 Virtualbox 驱动程序启动 Minishift 到操作系统主机时,它都需要一段疯狂的时间,而且它永远不会结束。有时我什至收到有关达到存储限制的错误消息。 不知道是不是描述h
您好,我正在使用 npm 运行一个基本的 React 项目,我正尝试在 docker 容器中启动它。但是我实际上无法让项目运行。我的 dockerfile 看起来像这样: FROM node:7.8.
所以我想从我的 SSH 终端开始游戏。 这真的很奇怪,当我直接从 Linux GUI 执行此操作时,它可以工作。但是当我使用 SSH 客户端进行远程连接时,它就崩溃了。似乎与我的显示驱动程序有关。 U
我有一个显示图像的动态壁纸。我在 Activity 中更改了该图像。然后我需要通知动态壁纸,以便它知道重新加载资源。 Intent 似乎是完美、简单的解决方案: Intent intent = new
我有一个似乎无法解决的问题。我在 Boot Dashboard 中使用 STS 3.9.2 从 Eclipse (Oxygen) 启动 Spring Boot 应用程序没有任何问题: 但是,当我尝试从
全新的 Python,在我开始摆弄东西之前先设置和安装东西。我的理解是 Python 2.7 和 Python 3.3 之间存在一些显着差异/不兼容,尽管这两个版本都得到了很好的使用,所以我认为最好安
在使用了很长时间的 jQuery 之后,我有一个问题,我正在使用 jQuery 模式(样式)编写一个简单的代码, (function(window, undefined) { var jQu
我正在尝试在 spring boot 应用程序下的非 spring 托管类中配置 Autowired。我在 tomcat 服务器下部署的 Web 应用程序下成功运行了这个。但是当我想在 spring
我对 xmonad 完全陌生,但我想开始使用它来提高我的工作效率。 这是我一直在使用的指南(我使用的是 Apple OS X Snow Leopard) http://xmonad.org/tour.
我试图将Spring Boot指南中的Managing Transactions示例扩展到两个数据源,但是@Transaction注释似乎仅对其中一个数据源有效。 在“Application.java
conEmu 有没有办法默认打开多个不同的选项卡? 我看到这个页面解释了如何使用 splits , 我意识到我可以按 Ctrl + T, 1, Enter,但我希望有一种方法可以自动执行此操作! "%
我正在寻找快速而肮脏的答案。我当时脑子一片空白,盯着屏幕看了 12 个小时以上,我想我中枪了。 我想做一个简单的 SignalR 应用程序作为教程。我找到了这个example ,但我不断收到票证未定义
我正在使用 Azure Powershell cmdlet 来启动/停止 VM。 Start-AzureVM [-ServiceName] [-Name] [ ] Stop-AzureVM [-S
我想使用Powershell脚本代码启动/停止iis和mssql 意味着当我运行ps脚本时,我想启动/停止iis和mssql 我在网上搜索了它,发现了一些代码,但按照我的要求无法正常工作 码: $ii
我在 liferay 工作。我们在我们的项目中使用一个模块来创建 liferay 主题。我使用命令 ant -Ddeploy.war=true 将它部署在服务器中。 war 文件在 liferay 部
我想在已安装 Python 2.7 的 Windows XP 计算机上运行 IPython(版本 0.12)。 我通过 Windows 二进制安装程序安装,但安装后 IPython 没有显示在菜单中,
我从创建了自己的简单图片。 FROM python:2.7.11 RUN mkdir /extra/later/ \ && mkdir /yyy 现在,我可以执行以下步骤: docker run
$(document).ready(function () { setTimeout(function() { window.location.reload(); }, 2000); // 2
我刚刚创建了一个帐户 OpenWeatherMap 我想通过城市 ID API 调用获取当前位置的天气: http://api.openweathermap.org/data/2.5/weather?
我注意到,如果我更改 xcasset 中的图像,启动 Storyboard不会更新。 例如,假设您的启动 Storyboard中有一个 UIImage View ,其中包含一个名为“logo”的蓝色图
我是一名优秀的程序员,十分优秀!