【Android】Android插件开发 —— 打开插件的Activity(预注册方式)

本文详细介绍了如何在Android应用中通过预注册方式打开插件Activity。首先创建插件接口和宿主Module,然后预注册插件Activity,并在AndroidManifest.xml中添加文件读取权限。接着在插件Module中实现Activity和入口类,尝试运行时会遇到ClassNotFoundException。通过反射将DexClassLoader的DexPathList注入到PathClassLoader中,解决了找不到Activity的问题。总结了预注册方式的优缺点,指出其灵活性不足和可能出现的组件冲突问题。
摘要由CSDN通过智能技术生成

Android插件开发 —— 打开插件的Activity(预注册方式)


1. 前言

上一篇博客《Android插件开发 —— 基础入门篇》中所讲的,我们可以用DexClassLoader加载插件中的类。但如果就这样打开插件中的Activity是无法打开的。这一篇博客主要讲如何打开插件中的Activity。开发工具为Android Studio。

2. 尝试打开插件中的Activity

1. 新建一个插件接口Module,名为PluginSDK

Module类型为Android Library。
包名为:zhp.android.plugin.sdk
定义一个接口,IPlugin.java:

package zhp.android.plugin.sdk;
import android.app.Activity;

/**
 * 供宿主程序和插件使用的接口
 */
public interface IPlugin {
   

    /**
     * 供宿主回调的方法
     */
    void execute(Activity activity);
}

2. 新建一个宿主Module,名为PluginHost

Module类型为Phone&Tablet module。
包名为:zhp.android.plugin.host
添加对PluginSDK的依赖。(如果不会用Android Studio添加依赖Module,参见上一篇博客)。
新建一个Activity名为MainActivity:

package zhp.android.plugin.host;

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import java.io.File;

import dalvik.system.DexClassLoader;
import dalvik.system.PathClassLoader;
import zhp.android.plugin.sdk.IPlugin;

/**
 * 宿主程序的MainActivity
 *  @author 郑海鹏
 *  @since 2015/11/17 19:13
 */
public class MainActivity extends AppCompatActivity {
   

    DexClassLoader classLoader;

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

    /**
     * 初始化classLoader
     */
    private void initClassLoader() {
        // 插件放在sd卡的根目录下
        String apkPath = Environment.getExternalStorageDirectory() + File.separator + "plugin.apk";

        // dex文件的释放目录
        File releasePath = getDir("dexs", 0);

        // 类加载器
        classLoader = new DexClassLoader(apkPath, releasePath.getAbsolutePath(), null, getClassLoader());
    }

    /**
     * 点击按钮以后打开插件
     */
    public void onClick(View view){
        openPlugin();
    }

    /**
     * 打开插件
     */
    private void openPlugin(){
        try{
            // 加载插件的入口类,并实例化出一个对象,回调execute()方法。
            Class<?> pl
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值