插件化—通过反射调用插件的函数

  1 package com.zyhitheima.plugindemo;
  2 import java.lang.reflect.Method;
  3 import java.util.ArrayList;
  4 import java.util.HashMap;
  5 import java.util.List;
  6 import java.util.Map;
  7
  8 import dalvik.system.PathClassLoader;
  9
 10 import android.os.Bundle;
 11 import android.view.View;
 12 import android.view.View.OnClickListener;
 13 import android.widget.Button;
 14 import android.widget.LinearLayout;
 15 import android.widget.Toast;
 16 import android.app.Activity;
 17 import android.content.Context;
 18 import android.content.Intent;
 19 import android.content.pm.PackageInfo;
 20 import android.content.pm.PackageManager;
 21 import android.content.pm.PackageManager.NameNotFoundException;
 22 import android.graphics.Color;
 23
 24 public class MainActivity extends Activity {
 25     private LinearLayout ll;
 26     @Override
 27     protected void onCreate(Bundle savedInstanceState) {
 28         super.onCreate(savedInstanceState);
 29         setContentView(R.layout.activity_main);
 30
 31         ll = (LinearLayout) findViewById(R.id.ll);
 32
 33         List<Map<String, Object>> plugins = new ArrayList<Map<String, Object>>();
 34         plugins = findPlugins();
 35         if(plugins.size() > 0){
 36             attachPlugin(plugins);
 37         }else{
 38             Toast.makeText(this, "没有相应的插件", 1).show();
 39         }
 40
 41     }
 42
 43     private void attachPlugin(List<Map<String, Object>> plugins) {
 44         if(plugins.size() > 0){
 45             for(Map<String, Object> map : plugins){
 46                 Button button = new Button(this);
 47                 button.setTextColor(Color.RED);
 48                 String label = (String) map.get("label");
 49                 final String pkgName = (String) map.get("pkgName");
 50                 button.setText(label);
 51
 52                 ll.addView(button);
 53                 button.setOnClickListener(new OnClickListener() {
 54                     @Override
 55                     public void onClick(View v) {
 56                         callPluginMethod(pkgName);
 57                     }
 58                 });
 59             }
 60         }
 61     }
 62
 63     private List<Map<String, Object>> findPlugins() {
 64         List<Map<String, Object>> plugins = new ArrayList<Map<String, Object>>();
 65         //包管理器
 66         PackageManager pm = this.getPackageManager();
 67         List<PackageInfo> installPackages = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);//获取所有安装的package包
 68         for(PackageInfo info : installPackages){
 69             String pkgName = info.packageName;
 70             String sharedUserId = info.sharedUserId;
 71             if(sharedUserId == null || !sharedUserId.equals("com.zyh.plugindemo") || pkgName.endsWith(this.getPackageName())){
 72                 continue;
 73             }
 74
 75             String label = (String) pm.getApplicationLabel(info.applicationInfo);
 76
 77             Map<String, Object> map = new HashMap<String, Object>();
 78             map.put("label", label);
 79             map.put("pkgName", pkgName);
 80             plugins.add(map);
 81         }
 82         return plugins;
 83     }
 84
 85     private void callPluginMethod(String packageName){
 86         Context pluginContext;
 87         try {
 88             pluginContext = this.createPackageContext(packageName, CONTEXT_IGNORE_SECURITY|CONTEXT_INCLUDE_CODE);
 89             //System.out.println(pluginContext.getPackageResourcePath());
 90             PathClassLoader pathClassLoader = new PathClassLoader(pluginContext.getPackageResourcePath(), ClassLoader.getSystemClassLoader());
 91             Class<?> clazz = Class.forName(packageName + ".Demo",true,pathClassLoader);
 92             Method info = clazz.getDeclaredMethod("info", new Class[]{});
 93             info.invoke(null, null);
 94
 95         } catch (Exception e) {
 96             // TODO Auto-generated catch block
 97             e.printStackTrace();
 98         }
 99     }
100
101 }
时间: 2024-12-14 16:24:23

插件化—通过反射调用插件的函数的相关文章

Android插件化开发之OpenAtlas插件启动方式与插件启动广播

到现在为止已经写了6篇文章了 Android插件化开发之OpenAtlas初体验 Android插件化开发之OpenAtlas生成插件信息列表 Android插件化开发之OpenAtlas资源打包工具补丁aapt的编译 Android插件化开发之OpenAtlas插件适配 Android插件化开发之解决OpenAtlas组件在宿主的注册问题 Android插件化开发之OpenAtlas中四大组件与Application功能的验证 这篇文章主要介绍一下OpenAtlas插件的几种启动方式,在Atl

在插件中得到,调用 插件的id

<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title></title></head><body><button id="btn">改变</button><script src="js/jquery.js"></

基于.NET MVC的高性能IOC插件化架构(二)之插件加载原理

上一篇博文简单介绍了下插件化的代码组成部门:http://www.cnblogs.com/gengzhe/p/4390932.html 这篇博客主要讲解下插件化实现的原理,先面先讲解几个概念: 一.契约 插件与系统必须有契约,系统才能发现插件并正确加载插件,我采用的是所有插件都实现Sun.Core里面的IPlugin接口. 二.自述 插件在被加载的时候,需要告诉系统,我是什么类型的插件,我的guid,我依赖的程序集,我的状态与权限,我的配置信息等等,这个行为是插件的自我描述,简称自述. 三.配置

Android插件化开发之Atlas插件适配

前三篇文章,介绍了OpenAtlas的一些基本用法以及patch的aapt的编译方法. - Android插件化开发之Atlas初体验 - Android插件化开发之Atlas生成插件信息列表 - Android插件化开发之Atlas资源打包工具补丁aapt的编译 OpenAtlas的原则就是避免引入冗余的库.也就是宿主中提供了第三方库后,插件中就不要再引入该库,编译的时候以provided形式提供即可.最简单的例子就是v4,v7兼容库,应该避免引入.为了让我妈的插件脱离OpenAtlas也能独

Android插件化探索(一)类加载器DexClassLoader

本文部分内容参考自<Android内核剖析> 基本概念 在Java环境中,有个概念叫做"类加载器"(ClassLoader),其作用是动态装载Class文件.标准的Java SDK中有一个ClassLoader类,借助它可以装载想要的Class文件,每个ClassLoader对象在初始化时必须指定Class文件的路径 没有使用过ClassLoader的读者可能会问:"在过去的程序开发中,当我们需要某个类时,只需使用import关键字包含该类就可以了,为什么还要类加

Android插件化开发之解决Atlas组件在宿主的注册问题

OpenAtlas有一个问题,就是四大组件必须在Manifest文件中进行注册,那么就必然带来一个问题,插件中的组件都要重复在宿主中注册.像Service,ContentProvider等组件目前没有什么好的解决方法,只能在宿主中注册.但是像Activity,显然是有解决方法的,就是使用Fragment代替Activity,Activity只是作为一个放Fragment的容器,那么不仅在插件中不用再清单文件中注册,就连宿主的注册问题也一并解决了.那么,解决方案呢,没错,就是之前写的一篇博文And

android 广播的插件化

------本文转载自 Android插件化原理解析--广播的管理 这一系列的文章实在是写的好! 1, 概述 为了实现Activity的插件化我们付出了相当多的努力:那么Android系统的 其他组件,比如BroadcastReceiver,Service还有ContentProvider,它们又该如何处理呢? 相比Activity,BroadcastReceiver要简单很多--广播的生命周期相当简单:如果希望插件能够支持广播,这意味着什么? 回想一下我们日常开发的时候是如何使用Broadca

Android基于代理的插件化思路分析

前言 正常的App开发流程基本上是这样的:开发功能-->测试--->上线,上线后发现有大bug,紧急修复---->发新版本---->用户更新----->bug修复.从发现bug到修复bug花了很长时间.我们希望bug的修复是立马生效的,用户无感知就能自动修复bug.当然,Android端的动态修复bug已经有不少框架了,不过我们今天讲的是另一个话题:Android的插件化.Android插件化有很多好处:热插拔.静默升级.bug动态修复.代码解耦等.正是因为如此,才有越来越多

Android插件化框架

1.   dynamic-load-apk/DL动态加载框架 是基于代理的方式实现插件框架,对 App 的表层做了处理,通过在 Manifest 中注册代理组件,当启动插件组件时,首先启动一个代理组件,然后通过这个代理组件来构建,启动插件组件. 需要按照一定的规则来开发插件 APK,插件中的组件需要实现经过改造后的 Activity.FragmentActivity.Service 等的子类. 优点如下: 动态升级, 高效并行开发(编译速度更快) 按需加载,内存占用更低等等DynamicLoad