Androidプラグインテクノロジー--(二)インストール済みapkをロード


前編ではAndroidに動的にプラグインjarをロードすることを理解しましたが、実際のプラグイン運用では、Androidメインapkが1つまたは任意のプラグインapkを動的にロードすることがよくあります.このプラグインapkはインストール済みまたはインストールされていないものであってもよく、機能も単純なjarよりも豊富です.
この記事では、インストールされたapkをロードしてリソースを取得し、Activityにジャンプする方法について説明します.
インストールされたapkでは、システムが完全な「アーカイブ」を作成し、対応するapiがcontextを取得することで、リソースを容易にロードしたり、activityをジャンプしたりすることができます.直接コード:
まず、Hostプロジェクトは以下の通りです.
public class MainActivity extends Activity {

    private static final String PLUGIN_PACKAGE = "com.example.androidplugin";

    private Context mPluginContext;
    private Resources mPluginResources;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                try {
                    Class<?> clazz = mPluginContext.getClassLoader().loadClass(
                            PLUGIN_PACKAGE + ".MainActivity");
                    startActivity(new Intent(mPluginContext, clazz));
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });

        loadInstalledApk();
    }

    private void loadInstalledApk() {
        try {
            mPluginContext = createPackageContext(PLUGIN_PACKAGE,
                    Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if (mPluginContext != null) {
            mPluginResources = mPluginContext.getResources();
            int resId = mPluginResources.getIdentifier("hello_world", "string", PLUGIN_PACKAGE);
            String text = mPluginResources.getString(resId);
            Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
        }
    }
}

Pluginプロジェクトは簡単で、以下の通りです.
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

次は、インストールされていないapkとそのリソースをロードする方法について説明します.インストールされていないapkはシステムが何も知らないため、apiでコンテキストを取得することもできず、自然にリソースを取得することもできないので、別の手段でこの問題を解決するしかありません.