Использование функции динамического приложения в базовом приложении - PullRequest
0 голосов
/ 23 января 2019

Предположим, у меня есть базовое приложение A с com.package.a именем пакета и B с com.package.b - это функция динамического приложения, которая будет загружена в мою базуприложение после установки базы апк.Узнайте больше о динамических функциях Теперь у меня есть макет в моем 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 Ответ

0 голосов
/ 23 января 2019

Если вы тестируете это локально, модуль 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().

...