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