Android插件技术——(二)加载已安装apk

上一篇我们了解了Android中动态加载插件jar,然而实际插件运用中,往往是Android主apk动态加载一个甚至任意个插件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获取其上下文,自然也就无法获取其资源,所以只能通过别的手段来解决这个问题,下一篇再叙。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值