gpt4 book ai didi

android - 如何在动态特性模块中启动一个Activity?

转载 作者:行者123 更新时间:2023-12-04 15:39:08 29 4
gpt4 key购买 nike

当通过 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com