Использование функции динамического приложения в базовом приложении
Предположим, у меня есть базовое приложение A с именем пакета com.package.a, а B с com.package.b - это функция динамического приложения, которая будет загружена в мое базовое приложение после установки базового apk. Узнайте больше о динамических функциях Теперь у меня есть макет в моем B (проект динамических объектов), к которому я хочу получить доступ в своем базовом приложении A. Я пробовал это, но у меня это не работает.
Это макет, к которому я хочу получить доступ из приложения динамических функций B:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/lottie_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
tools:context=".LottieAnimationActivity">
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/lottie_animation_view"
android:layout_width="match_parent"
android:background="@color/white"
app:lottie_fileName="animation.json"
android:layout_height="wrap_content" />
</RelativeLayout>
И это то, как я делаю это в своей деятельности
public class SplashActivity extends Activity {
@BindView(R.id.splash_logo)
ImageView splash_logo;
private int sessionID;
private boolean dynamicModule = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SplitInstallManager splitInstallManager = SplitInstallManagerFactory.create(this);
SplitInstallRequest request = SplitInstallRequest
.newBuilder()
.addModule("lottie")
.build();
SplitInstallStateUpdatedListener listener = new SplitInstallStateUpdatedListener() {
@Override
public void onStateUpdate(SplitInstallSessionState splitInstallSessionState) {
if(splitInstallSessionState.sessionId() == sessionID) {
switch (splitInstallSessionState.status()) {
case SplitInstallSessionStatus.INSTALLED:
Log.v("lottie", "lottie Module installed");
try
{
PackageManager manager = getPackageManager();
Resources resources = manager.getResourcesForApplication("com.package.b");
int resId = resources.getIdentifier("lottie_animation_view", "layout", "com.package.b");
RelativeLayout alayout = (RelativeLayout) resources.getLayout(resId);
setContentView(resId);
}
catch (Exception e)
{
e.printStackTrace();
setContentView(R.layout.activity_splash);
Toast.makeText(SplashActivity.this, "error", Toast.LENGTH_LONG).show();
}
break;
case SplitInstallSessionStatus.CANCELED:
// TODO
break;
case SplitInstallSessionStatus.DOWNLOADED:
Toast.makeText(SplashActivity.this, " Downloaded but not installed", Toast.LENGTH_LONG).show();
// TODO
break;
case SplitInstallSessionStatus.PENDING:
// TODO
break;
case SplitInstallSessionStatus.FAILED:
// TODO
setContentView(R.layout.activity_splash);
break;
case SplitInstallSessionStatus.DOWNLOADING:
setContentView(R.layout.activity_splash);
break;
}
}
}
};
splitInstallManager.registerListener(listener);
splitInstallManager.startInstall(request)
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
}
})
.addOnSuccessListener(new OnSuccessListener<Integer>() {
@Override
public void onSuccess(Integer sessionId) {
sessionID = sessionId;
}
});
Я просто проверяю, установлена ли динамическая функция или нет. Если он установлен, тогда я устанавливаю contentView как макет, представленный в com.package.B динамической функции.
Пожалуйста, помогите кому-нибудь в этом.
1 ответ
Если вы тестируете это локально, onDemand
модуль не будет загружен через PlayCore API
,
Как правило, прежде чем вы сможете получить доступ к коду / ресурсам из модуля onDemand, вы должны убедиться, что SplitCompat.install(context)
называется в attachBaseContext
как это или похоже:
override fun attachBaseContext(newBase: Context?) {
super.attachBaseContext(newBase)
SplitCompat.install(this)
}
Также убедитесь, что приложение все еще будет a
при запросе менеджера пакетов.
manager.getResourcesForApplication("com.package.a");
с большей вероятностью даст результат для данного ресурса.
С точки зрения UX не рекомендуется загружать модуль onDemand, пока отображается заставка, а затем заменять представления в этом действии.
При этом, пожалуйста, проверьте журнал исключений в блоке catch. Вход через Log.v
скорее, чем e.printStackTrace()
,