Androidプラグイン化開発によるOpenAtlasコンポーネントの宿主への登録問題の解決
OpenAtlasには、4つのコンポーネントがManifestファイルに登録されなければならないという問題があります.プラグインのコンポーネントは宿主に繰り返し登録されます.サービス、ContentProviderなどのコンポーネントは現在、良い解決策がなく、ホストに登録するしかありません.しかし、Activityのように、Activityの代わりにFragmentを使用する方法は明らかであり、ActivityはFragmentを置く容器としてしか使用されず、プラグインにリストファイルに登録するだけでなく、宿主の登録問題も一緒に解決される.では、解決策は、間違いなく、前に書いたブログAndroidがFragmentを使って万能ページ切り替えの枠組みを作ったことです.以下を読む前に、必ずこの文章を読んでください.
しかし、このページ切り替えフレームを使用することは、フレームでは反射によってFragmentが呼び出されるが、ホストでは反射を直接使用するとjavaが報告されるという問題をもたらす.lang.ClassNotFoundExceptionのエラーは、OpenAtlasが提供するプラグインのClassLoaderを使用してロードする必要があります.OpenAtlasをサポートするために、このフレームワークを修正してOpenAtlasをサポートさせました.
コンフィギュレーションクラスCoreConfigに2つの変数を追加し、OpenAtlasを有効にするかどうかを制御し、ClassLoaderを設定および取得し、静的getterメソッドとsetterメソッドを提供します.
元のコア関数を修正し、CoreConfigのブール変数がOpenAtlasを有効にしているかどうかを判断します.デフォルトでは有効になりません.有効になっている場合はgetBundleClassLoader関数でClassLoaderを取得しますが、setBundleClassLoader関数を呼び出してClassLoaderを設定した場合は、空ではありません.
次にホストで呼び出すときはOpenAtlasのサポートをオンにしてClassLoaderを設定し、ClassLoaderの取得はAtlasのメンバー関数getBundleClassLoader()によって取得されます.この関数は、プラグインのパッケージ名、すなわち、以前に生成されたプラグイン情報リストのjsonのpkgNameに対応するパラメータを渡す必要があります.
その後の開発は通常のプログラムの開発です.ただし、宿主のエントリActivityは、ページ切替フレームのBaseActivityを継承する必要があり、setContentViewを呼び出してページ設定を行う必要がなく、openPage関数を直接使用してFragmentを開くだけでよい、プラグインのFragmentは、ページ切替フレームのBaseFragmentを継承し、宿主ApplicationでCoreConfigを呼び出すことを覚えておいてください.init(this);フレームワークの初期化を行います.
次にホストで呼び出し、ClassLoaderの設定とOpenAtlasのサポートのオープンを覚えておいてください.Fragmentのプロファイルjsonは宿主に拷問する必要はありません.
プラグインでは、このフレームワークをパッケージ化するのではなく、コンパイル時に提供するだけで、具体的な適合作業は前の記事Androidプラグイン化開発のAtlasプラグイン適合を参照してください.
最後に、サンプルソースコードを提供します.
http://download.csdn.net/detail/sbsujjbcy/9031679
しかし、このページ切り替えフレームを使用することは、フレームでは反射によってFragmentが呼び出されるが、ホストでは反射を直接使用するとjavaが報告されるという問題をもたらす.lang.ClassNotFoundExceptionのエラーは、OpenAtlasが提供するプラグインのClassLoaderを使用してロードする必要があります.OpenAtlasをサポートするために、このフレームワークを修正してOpenAtlasをサポートさせました.
コンフィギュレーションクラスCoreConfigに2つの変数を追加し、OpenAtlasを有効にするかどうかを制御し、ClassLoaderを設定および取得し、静的getterメソッドとsetterメソッドを提供します.
/** * Atlas start */
private static boolean isOpenAtlas=false;
private static ClassLoader mBundleClassLoader =null;
public static boolean isOpenAtlas() {
return isOpenAtlas;
}
public static void setIsOpenAtlas(boolean isOpenAtlasFlag) {
isOpenAtlas = isOpenAtlasFlag;
}
public static ClassLoader getBundleClassLoader() {
return mBundleClassLoader;
}
public static void setBundleClassLoader(ClassLoader classLoader) {
mBundleClassLoader = classLoader;
}
/** * Atlas end */
元のコア関数を修正し、CoreConfigのブール変数がOpenAtlasを有効にしているかどうかを判断します.デフォルトでは有効になりません.有効になっている場合はgetBundleClassLoader関数でClassLoaderを取得しますが、setBundleClassLoader関数を呼び出してClassLoaderを設定した場合は、空ではありません.
/** * Atlas start */
if (CoreConfig.isOpenAtlas()){
ClassLoader bundleClassLoader = CoreConfig.getBundleClassLoader();
if(bundleClassLoader==null){
Log.d(TAG, "OpenAtlas bundle ClassLoader is null!");
return null;
}
fragment = (BaseFragment) CoreConfig.getBundleClassLoader().loadClass(corePage.getClazz()).newInstance();
}else{
fragment = (BaseFragment) Class.forName(corePage.getClazz()).newInstance();
}
/** * Atlas end */
次にホストで呼び出すときはOpenAtlasのサポートをオンにしてClassLoaderを設定し、ClassLoaderの取得はAtlasのメンバー関数getBundleClassLoader()によって取得されます.この関数は、プラグインのパッケージ名、すなわち、以前に生成されたプラグイン情報リストのjsonのpkgNameに対応するパラメータを渡す必要があります.
その後の開発は通常のプログラムの開発です.ただし、宿主のエントリActivityは、ページ切替フレームのBaseActivityを継承する必要があり、setContentViewを呼び出してページ設定を行う必要がなく、openPage関数を直接使用してFragmentを開くだけでよい、プラグインのFragmentは、ページ切替フレームのBaseFragmentを継承し、宿主ApplicationでCoreConfigを呼び出すことを覚えておいてください.init(this);フレームワークの初期化を行います.
次にホストで呼び出し、ClassLoaderの設定とOpenAtlasのサポートのオープンを覚えておいてください.Fragmentのプロファイルjsonは宿主に拷問する必要はありません.
CoreConfig.setIsOpenAtlas(true);
ClassLoader bundleClassLoader = Atlas.getInstance().getBundleClassLoader("com.lizhangqu.fragment");
CoreConfig.setBundleClassLoader(bundleClassLoader);
openPage("test", null, CoreAnim.none);
プラグインでは、このフレームワークをパッケージ化するのではなく、コンパイル時に提供するだけで、具体的な適合作業は前の記事Androidプラグイン化開発のAtlasプラグイン適合を参照してください.
最後に、サンプルソースコードを提供します.
http://download.csdn.net/detail/sbsujjbcy/9031679