はじめに :
Androidのプロジェクトは、多くの場合、実行時にリソースを参照する必要があります。使用 Resources
取得するには res
デバイス関連のリソースディレクトリの様々な。使用し AssetManager
得るために assets
リソースディレクトリを。
リソースは、2つのカテゴリに分けられ、システムリソース、エンジニアリング・リソース、サードパーティのリソースを、プラグインやその他のリソースを、次のとおりです。
- ストレージは、コンパイル済みのリソースファイルを、コンパイルすることができ、リソースへのアクセスが比較的簡単であるように、システムが自動的に、リソースファイル内の次のID RESディレクトリR.javaが生成されます、R.id.filenam eはプログラムで呼び出すことによってすることができます。
- システムがリソースファイルの下でコンパイル時の資産にコンパイルされることはありませんので、我々はそれらにアクセスするためのR.id.filename方法をすることができないので、元のリソースファイルは、資産ディレクトリの下に格納されています。私はそれらにアクセスするためのリソースの絶対パスを渡すことはできませんか?インストール後のAPKが/data/app/**.apkディレクトリの下に配置されますので、資産はAPKにバインドされ、APKは形で存在し、ダウン/データ/データ/ YourAppのディレクトリに展開していないので、我々は直接できません彼らは単に独立して存在しないため、資産の絶対パスを取得します
RES /生との資産類似点:
完全なパッケージに保存されているディレクトリの両方がパッケージをAPKます後にファイル1は、バイナリに変換されることはありません。
違いのres /生との資産:
1.res / RAWファイルを直接R.id.filenameあるリソースIDを使用してアクセスする場合R.javaファイルにマップされ、ファイルアセットフォルダはなりませんR.javaにマッピングされ、訪問の時間はAssetManagerクラスが必要です。
ディレクトリ構造を持っていない生の2.res /、ディレクトリ構造ができた資産(ディレクトリフォルダを作成することができている)
3.リードRES /によって取得された入力ストリームで生のファイルリソース:
。入力ストリームは= getResources()openRawResource(R.id.filename)です。
資産の下で、ファイルのリソースを読んで、次の方法で入力ストリームを取ります。
InputStreamが= getResources()..ですgetAssets()オープン( "ファイル名");
どんなにリソースの種類、および最終的には入り口を介して取得することができ、そして入り口がリソースオブジェクトです。リソースオブジェクトは、このような解像度のAndroidのエンジニアリング、資産のカタログとの.classファイルに加えて、他のリソースの下などのAndroidリソースファイルを、説明し、我々は、リソースへのアクセスに関連するすべての場所は、あなたが取得するためのリソースを使用することができると言うことができます。実際には、我々は多くの場合、ストリームデータは、オブジェクトを直接取得するリソースディレクトリコードAssetmanager資産を読んで直接使用していますが、同時に同じオブジェクトを指して、プロパティリソースAssetManagerオブジェクトに属します。
リソースの分析:
いくつかの重要なメンバープロパティ1.Resourcesオブジェクト:
静的リソースmSystem = ヌル ; // デフォルトのリソース管理を表し静的オブジェクトとしてmSystem。 最終的なオブジェクトmAccessLock = 新しい新しいオブジェクト(); 最終設定mTmpConfig = 新しい新しい構成(); TypedValue mTmpValue = 新しい新しいTypedValue(); 最終 AssetManager mAssets; // mAssets既定のインスタンスを指し、マセットはCで行われる初期化プロセスを作成++層A。 民間 最終的なコンフィギュレーションmConfiguration = 新しい新しいコンフィギュレーション(); 最終 DisplayMetrics mMetrics = 新新DisplayMetrics(); プライベート NativePluralRules mPluralRule。
1つの プライベートリソース(){ 2 mAssets = AssetManager.getSystem()。 図3は、 // 注:意図的に(すべての値が設定され、初期化されていないこれを残して 4 //が必要と何かをしようと誰ように、ゼロに) 5つの // メトリックは非常に間違った値を取得します。 6 mConfiguration.setToDefaults()。 7 mMetrics.setToDefaults()。 8 updateConfiguration(NULL、NULL ); 9 mAssets.ensureStringBlocks()。 10 }
我々は独自のアプリケーションを開発する場合、それは彼らがプロジェクトディレクトリのフォルダやアセットフォルダにRESファイルの下に配置する必要があるリソースを持つことです。プロジェクトの時間をコンパイルする場合、リソース、およびソースファイルはAPKの内側にパッケージ化されます。アプリケーションを実行する場合、ポインティングファイルのAPK内のデフォルトのパスAssetManagerリソースは、通常のアプリケーションならば、一般のapkファイルがシステム/アプリ上で、データ/ appディレクトリにシステムのapkアプリケーションパッケージを置いています。
あなたは、アプリケーションを起動Assetmanager、AssetManagerによってリソースが、その後、設定されたパスに基づいてAPKリソースを見つけるときに、あなたは自分自身の正しい情報を見つけることができます。
リソースへのAssetManagerアクセスがポイント・パスに基づいて行われるため、理論的には、我々はあなたが自分自身のリソースを読み込む指定することができ、AssetManagerが読んパスを変更し、実際に、このような設計をして。私たちは、あなたが設定されAssetManagerポイントAPKリソースのパスを聞かせもしそうなら、あなたはAPKを抽出し、リソースの目的を達成することができます。主による動的テーマパッケージの一部の実装原理AssetsManager.addAssetPath(String path)
このインタフェースは、対応するテーマパッケージの作成 Resources
を達成するためにオブジェクトを。
デモ:
方法は、以下の重要な属性を含み、リソース管理のための新しいクラスResourcesManager:
1 AssetManager mAssetManager = NULL ; 2つの リソースmResources = nullを。 3 LayoutInflater mLayoutInflater = NULL ; 4 テーマmTheme = NULL ; 5 クラスローダmClassLoader = NULL ; 6 //ResApk.apk资源文件 7 列のpackageName = "com.example.testapk" 。 8 文字列LIBPATH = 。Environment.getExternalStorageDirectory()のtoString() 9 + File.separator + "ResApk.apk" 。 10 11は、 保護されました ボイドinitAssetManager(){ 12 のtry { 13 AssetManager assetManager = AssetManager。クラス.newInstance(); 14 方法addAssetPath = 。assetManager.getClass()getMethod( 15 "addAssetPath"、文字列。クラス)。 16 addAssetPath.invoke(assetManager、LIBPATH)。 17 mAssetManager = assetManager。 18 } キャッチ(例外e){ 19 e.printStackTrace(); 20 } 21 リソースsuperRes =スーパー.getResources(); 22 mResources = 新しいリソース(mAssetManager、superRes.getDisplayMetrics()、 23 superRes.getConfiguration())。 24 }
mResources ResApk.apkは、リソースの内部を指し、あなたは、対応するリソースの名前で取得することができます。
1 公共 int型getDrawableId(文字列imgName){ 2 リターン mResources.getIdentifier(imgName、 "描画可能" 、apkPackageName)。 3 } 4 5 / ** 6 *获取图片资源 7 * 8 * @param imgName 9 * @return 描画可能な 10 * / 11 公共の描画領域getResApkDrawable(文字列imgName){ 12 リターンmResources.getDrawable(getDrawableId(imgName))。 13 }
特に注目すべきは、各アプリケーション・コンテキスト・オブジェクトが同じではないので、私たちはいつもあなたが注意して、コンテキスト・センシティブ関数法で使用する独自のリソースファイルを使用していない場合ことを覚えておくべきであるということです。
元の参照ブログリンク:https://blog.csdn.net/MeteorLuoyidong/article/details/49530839
https://www.cnblogs.com/jpfss/p/9876370.html