当前位置:首页 > 安卓源码 > 技术博客 >

Android利用奇虎DroidPlugin实现插件化

时间:2017-10-13 17:31 来源:互联网 作者:源码搜藏 浏览: 收藏 挑错 推荐 打印

集成起来很简单。在这里我也只是尝尝鲜而已实际。项目中并没有用到 截图先上: DroidPlugin项目地址: https : //github.com/DroidPluginTeam/DroidPlugin 开始集成: 我们只需要将Droid Plugin当作一个lib工程应用到主项目中,然后: 在 AndroidManifest.x

集成起来很简单。在这里我也只是尝尝鲜而已实际。项目中并没有用到

截图先上:

Android利用奇虎DroidPlugin实现插件化

 

DroidPlugin项目地址:https//github.com/DroidPluginTeam/DroidPlugin

开始集成:

 

  1. 我们只需要将Droid Plugin当作一个lib工程应用到主项目中,然后:

  2. AndroidManifest.xml中使用插件的com.morgoo.droidplugin.PluginApplication

    <application android:name="com.morgoo.droidplugin.PluginApplication" 
                 android:label="@string/app_name"
                 android:icon="@drawable/ic_launcher" 
    
  3. 如果你使用自定义的Application,那么你需要在自定义的应用程序类  onCreateattachBaseContext方法中添加如下代码:

    @Override
    public void onCreate() {
        super.onCreate();
        //这里必须在super.onCreate方法之后,顺序不能变
        PluginHelper.getInstance().applicationOnCreate(getBaseContext());
    }
    
    @Override
    protected void attachBaseContext(Context base) {
        PluginHelper.getInstance().applicationAttachBaseContext(base);
        super.attachBaseContext(base);
    }
    
  4. 修改  Libraries\DroidPlugin\build.gradle 的defaultConfig配置中  authorityName 的值(建议改为自己的包名+标识,防止跟其它本插件使用者冲突)

  5. 集成完成。

把我们的插件apk(简单的helloworld都可以)放到指定目录。

 

安装一个插件:

 

[java] 查看纯文本 
 
  1. PluginManager.getInstance()。installPackage(file.getAbsolutePath(),PackageManagerCompat.INSTALL_REPLACE_EXISTING);  

卸载一个插件:

 

 

[java] 查看纯文本 
 
  1. PluginManager.getInstance()。deletePackage(PLUGIN_PACKAGE_NAME,  );  

启动插件:

 

 

[java] 查看纯文本 
 
  1. PackageManager pm = getPackageManager();  
  2.        Intent intent = pm.getLaunchIntentForPackage(PLUGIN_PACKAGE_NAME);  
  3.        if  (null  != intent){  
  4.            startActivity(意向);  
  5.        }  else  {  
  6.            Toast.makeText(getApplicationContext(),  “插件还未安装” ,Toast.LENGTH_SHORT).show();  
  7.        }  

完整代码:

 

 

[java] 查看纯文本 
 
  1. package  com.example.gk.testpluginhost;  
  2.   
  3. 导入 android.content.Intent;  
  4. import  android.content.pm.ApplicationInfo;  
  5. import  android.content.pm.PackageInfo;  
  6. import  android.content.pm.PackageManager;  
  7. 导入 android.os.Environment;  
  8. 导入 android.os.RemoteException;  
  9. 导入 android.support.v7.app.AppCompatActivity;  
  10. 导入 android.os.Bundle;  
  11. 导入 android.util.Log;  
  12. 导入 android.view.View;  
  13. 导入 android.widget.Button;  
  14. 导入 android.widget.TextView;  
  15. 导入 android.widget.Toast;  
  16.   
  17. import  com.morgoo.droidplugin.pm.PluginManager;  
  18. import  com.morgoo.helper.compat.PackageManagerCompat;  
  19.   
  20. import  java.io.File;  
  21. import  java.util.List;  
  22.   
  23. / ** 
  24.  *测试插件化 
  25.  * /  
  26. public class  MainActivity  extends  AppCompatActivity  implements  View.OnClickListener {   
  27.     私人 TextView txt_title;  
  28.     私人 按钮btn_check;  
  29.     私人 按钮btn_install;  
  30.     私人 按钮btn_uninstall;  
  31.     私人 按钮btn_open;  
  32.     public static final  String PLUGIN_PACKAGE_NAME =  “com.kk.imgod.testcustomview” ;    
  33.   
  34.     @覆盖  
  35.     protected void  onCreate(Bundle savedInstanceState){   
  36.         超级.onCreate(savedInstanceState);  
  37.         的setContentView(R.layout.activity_main);  
  38.         initViews();  
  39.     }  
  40.   
  41.     private void  initViews(){   
  42.         txt_title =(TextView)findViewById(R.id.txt_title);  
  43.         btn_check =(Button)findViewById(R.id.btn_check);  
  44.         btn_install =(Button)findViewById(R.id.btn_install);  
  45.         btn_uninstall =(Button)findViewById(R.id.btn_uninstall);  
  46.         btn_open =(Button)findViewById(R.id.btn_open);  
  47.         btn_check.setOnClickListener(this );  
  48.         btn_install.setOnClickListener(this );  
  49.         btn_uninstall.setOnClickListener(this );  
  50.         btn_open.setOnClickListener(this );  
  51.     }  
  52.   
  53.     @覆盖  
  54.     public void  onClick(View v){   
  55.         switch  (v.getId()){  
  56.             case  R.id.btn_check:  
  57.                 检查();  
  58.                 打破;  
  59.             case  R.id.btn_install:  
  60.                 安装();  
  61.                 打破;  
  62.             case  R.id.btn_uninstall:  
  63.                 卸载();  
  64.                 打破;  
  65.             案例 R.id.btn_open:  
  66.                 openPlugin();  
  67.                 打破;  
  68.             默认值:  
  69.                 打破;  
  70.         }  
  71.     }  
  72.   
  73.     / ** 
  74.      *检查是否已经安装了插件 
  75.      * /  
  76.     private void  check(){   
  77.         Intent intent = getLaunchehIntent();  
  78.         //通过这种方法来判断插件是不是安装不准确,毕竟如果插件是安装在手机里面的话也不为空  
  79.         //精准的方法是通过下面插件管理里面的方法,然后再判断  
  80.         if  (null  != intent){  
  81.             Toast.makeText(getApplicationContext(),  “当前插件已经安装” ,Toast.LENGTH_SHORT).show();  
  82.         }  else  {  
  83.             Toast.makeText(getApplicationContext(),  “当前插件还未安装” ,Toast.LENGTH_SHORT).show();  
  84.         }  
  85.   
  86.         尝试 {  
  87.             List <ApplicationInfo> appList = PluginManager.getInstance()。getInstalledApplications();  
  88.             if  (null  != appList){  
  89.                 Log.e(“test” ,  “installed app:”  + appList.size());  
  90.                 for  (ApplicationInfo applicationInfo:appList){  
  91.                     Log.e(“test_app” ,applicationInfo.packageName);  
  92.                 }  
  93.   
  94.             }  
  95.         }  catch  (RemoteException e){  
  96.             e.printStackTrace();  
  97.         }  
  98.   
  99.         尝试 {  
  100.             列表<PackageInfo> packageList = PluginManager.getInstance()。getInstalledPackages();  
  101.             if  (null  != packageList){  
  102.                 Log.e(“test” ,  “installed package:”  + packageList.size());  
  103.                 for  (PackageInfo packageInfo:packageList){  
  104.                     Log.e(“test_package” ,packageInfo.packageName);  
  105.                 }  
  106.             }  
  107.         }  catch  (RemoteException e){  
  108.             e.printStackTrace();  
  109.         }  
  110.     }  
  111.   
  112.     / ** 
  113.      *安装插件 
  114.      * /  
  115.     private void  install(){   
  116.         //获取插件  
  117.         File file =  new  File(Environment.getExternalStorageDirectory(),  “/apppp/app/test_plugin.apk” );  
  118.         //没有插件  
  119.         if  (file.exists()){  
  120.             Log.e(“test” ,  “插件文件存在” );  
  121.             int  installResult =  ;  
  122.             尝试 {  
  123.                 installResult = PluginManager.getInstance()。installPackage(file.getAbsolutePath(),PackageManagerCompat.INSTALL_REPLACE_EXISTING);  
  124.             }  catch  (RemoteException e){  
  125.                 e.printStackTrace();  
  126.                 Log.e(“test” ,  “插件文件安装失败” );  
  127.             }  
  128.             Log.e(“test” ,  “插件文件安装成功:installResult:”  + installResult);  
  129.             if  (installResult == PackageManagerCompat.INSTALL_SUCCEEDED){  
  130.                 Toast.makeText(getApplicationContext(),  “插件安装成功” ,Toast.LENGTH_SHORT).show();  
  131.             }  else  {  
  132.                 Toast.makeText(getApplicationContext(),  “插件安装失败:”  + installResult,Toast.LENGTH_SHORT).show();  
  133.             }  
  134.         }  else  {  
  135.             Log.e(“test” ,  “插件文件不存在” );  
  136.         }  
  137.     }  
  138.   
  139.     / ** 
  140.      *卸载插件 
  141.      * /  
  142.     private void  unInstall(){   
  143.         //获取插件  
  144.         //没有插件  
  145.         尝试 {  
  146.             PluginManager.getInstance()。deletePackage(PLUGIN_PACKAGE_NAME,  );  
  147.             Toast.makeText(getApplicationContext(),  “插件卸载成功” ,Toast.LENGTH_SHORT).show();  
  148.         }  catch  (RemoteException e){  
  149.             e.printStackTrace();  
  150.             Toast.makeText(getApplicationContext(),  “插件卸载失败” ,Toast.LENGTH_SHORT).show();  
  151.         }  
  152.     }  
  153.   
  154.     / ** 
  155.      *打开插件 
  156.      * /  
  157.     private void  openPlugin(){   
  158.         Intent intent = getLaunchehIntent();  
  159.         if  (null  != intent){  
  160. // intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //经测试不用这个flag也行  
  161.             startActivity(意向);  
  162.             Log.e(“test” ,  “插件已经启动” );  
  163.         }  else  {  
  164.             Toast.makeText(getApplicationContext(),  “插件还未安装” ,Toast.LENGTH_SHORT).show();  
  165.         }  
  166.     }  
  167.   
  168.     / ** 
  169.      *拿到意图 
  170.      * 
  171.      * @返回 
  172.      * /  
  173.     private  Intent getLaunchehIntent(){  
  174.         PackageManager pm = getPackageManager();  
  175.         Intent intent = pm.getLaunchIntentForPackage(PLUGIN_PACKAGE_NAME);  
  176.         回报 意向  
  177.     }  
  178. }

Android利用奇虎DroidPlugin实现插件化 转载https://www.codesocang.com/appboke/36678.html

技术博客阅读排行

最新文章