Android 利用奇虎DroidPlugin实现插件化
来源:互联网 发布:mac爱奇艺 编辑:程序博客网 时间:2024/05/16 17:29
集成起来很简单.在这里我也只是尝尝鲜而已.实际项目中并没有用到
截图先上:
DroidPlugin项目地址:https://github.com/DroidPluginTeam/DroidPlugin
开始集成:
我们只需要将Droid Plugin当作一个lib工程应用到主项目中,然后:
在
AndroidManifest.xml
中使用插件的com.morgoo.droidplugin.PluginApplication
:<application android:name="com.morgoo.droidplugin.PluginApplication" android:label="@string/app_name" android:icon="@drawable/ic_launcher"
如果你使用自定义的
Application
,那么你需要在自定义的Application classonCreate
和attachBaseContext
方法中添加如下代码:@Overridepublic void onCreate() { super.onCreate(); //这里必须在super.onCreate方法之后,顺序不能变 PluginHelper.getInstance().applicationOnCreate(getBaseContext());}@Overrideprotected void attachBaseContext(Context base) { PluginHelper.getInstance().applicationAttachBaseContext(base); super.attachBaseContext(base);}
修改
Libraries\DroidPlugin\build.gradle
的 defaultConfig 配置中authorityName
的值(建议改为自己的包名+标识,防止跟其它本插件使用者冲突)集成完成。
安装一个插件:
PluginManager.getInstance().installPackage(file.getAbsolutePath(), PackageManagerCompat.INSTALL_REPLACE_EXISTING);
卸载一个插件:
PluginManager.getInstance().deletePackage(PLUGIN_PACKAGE_NAME, 0);
启动插件:
PackageManager pm = getPackageManager(); Intent intent = pm.getLaunchIntentForPackage(PLUGIN_PACKAGE_NAME); if (null != intent) { startActivity(intent); } else { Toast.makeText(getApplicationContext(), "插件还未安装", Toast.LENGTH_SHORT).show(); }
完整代码:
package com.example.gk.testpluginhost;import android.content.Intent;import android.content.pm.ApplicationInfo;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.os.Environment;import android.os.RemoteException;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;import com.morgoo.droidplugin.pm.PluginManager;import com.morgoo.helper.compat.PackageManagerCompat;import java.io.File;import java.util.List;/** *测试插件化 */public class MainActivity extends AppCompatActivity implements View.OnClickListener { private TextView txt_title; private Button btn_check; private Button btn_install; private Button btn_uninstall; private Button btn_open; public static final String PLUGIN_PACKAGE_NAME = "com.kk.imgod.testcustomview"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViews(); } private void initViews() { txt_title = (TextView) findViewById(R.id.txt_title); btn_check = (Button) findViewById(R.id.btn_check); btn_install = (Button) findViewById(R.id.btn_install); btn_uninstall = (Button) findViewById(R.id.btn_uninstall); btn_open = (Button) findViewById(R.id.btn_open); btn_check.setOnClickListener(this); btn_install.setOnClickListener(this); btn_uninstall.setOnClickListener(this); btn_open.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_check: check(); break; case R.id.btn_install: install(); break; case R.id.btn_uninstall: unInstall(); break; case R.id.btn_open: openPlugin(); break; default: break; } } /** * 检查是否已经安装了插件 */ private void check() { Intent intent = getLaunchehIntent(); //通过这种方法来判断插件是不是安装不准确,毕竟如果插件是安装在手机里面的话也不为空 //精准的方法是通过下面PluginManager里面的方法,然后再判断 if (null != intent) { Toast.makeText(getApplicationContext(), "当前插件已经安装", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "当前插件还未安装", Toast.LENGTH_SHORT).show(); } try { List<ApplicationInfo> appList = PluginManager.getInstance().getInstalledApplications(0); if (null != appList) { Log.e("test", "installed app:" + appList.size()); for (ApplicationInfo applicationInfo : appList) { Log.e("test_app", applicationInfo.packageName); } } } catch (RemoteException e) { e.printStackTrace(); } try { List<PackageInfo> packageList = PluginManager.getInstance().getInstalledPackages(0); if (null != packageList) { Log.e("test", "installed package:" + packageList.size()); for (PackageInfo packageInfo : packageList) { Log.e("test_package", packageInfo.packageName); } } } catch (RemoteException e) { e.printStackTrace(); } } /** * 安装插件 */ private void install() { //获取插件 File file = new File(Environment.getExternalStorageDirectory(), "/apppp/app/test_plugin.apk"); //没有插件 if (file.exists()) { Log.e("test", "插件文件存在"); int installResult = 0; try { installResult = PluginManager.getInstance().installPackage(file.getAbsolutePath(), PackageManagerCompat.INSTALL_REPLACE_EXISTING); } catch (RemoteException e) { e.printStackTrace(); Log.e("test", "插件文件安装失败"); } Log.e("test", "插件文件安装成功:installResult:" + installResult); if (installResult == PackageManagerCompat.INSTALL_SUCCEEDED) { Toast.makeText(getApplicationContext(), "插件安装成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "插件安装失败:" + installResult, Toast.LENGTH_SHORT).show(); } } else { Log.e("test", "插件文件不存在"); } } /** * 卸载插件 */ private void unInstall() { //获取插件 //没有插件 try { PluginManager.getInstance().deletePackage(PLUGIN_PACKAGE_NAME, 0); Toast.makeText(getApplicationContext(), "插件卸载成功", Toast.LENGTH_SHORT).show(); } catch (RemoteException e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "插件卸载失败", Toast.LENGTH_SHORT).show(); } } /** * 打开插件 */ private void openPlugin() { Intent intent = getLaunchehIntent(); if (null != intent) {// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//经测试 不用这个flag也行 startActivity(intent); Log.e("test", "插件已经启动"); } else { Toast.makeText(getApplicationContext(), "插件还未安装", Toast.LENGTH_SHORT).show(); } } /** * 拿到Intent * * @return */ private Intent getLaunchehIntent() { PackageManager pm = getPackageManager(); Intent intent = pm.getLaunchIntentForPackage(PLUGIN_PACKAGE_NAME); return intent; }}
集成还是很简单的
demo地址:https://github.com/imgod1/TestPluginHost
0 0
- Android 利用奇虎DroidPlugin实现插件化
- Android 插件化框架DroidPlugin
- Android Plugin 插件化技术:DroidPlugin
- 【Android实战】DroidPlugin插件化应用分析
- [Android 插件化(二)] DroidPlugin 用法
- Android 插件化之DroidPlugin 用法
- 插件化开发--DroidPlugin
- 360 Android 插件项目 DroidPlugin
- DroidPlugin插件框架 - 《Android必备技能》
- 应用插件化实践--DroidPlugin的使用
- 应用插件化实践--DroidPlugin的使用
- 插件化之DroidPlugin深度hook
- android 使用360插件化DroidPlugin碰到的坑(持续更新)
- 一个360 Droidplugin的运用,实现支付插件化,以及插件化实现时遇到的一些问题
- Android插件实例——360 DroidPlugin详解
- Android插件实例——360 DroidPlugin详解
- Android插件实例——360 DroidPlugin详解
- Android插件实例——360 DroidPlugin详解
- 【算法】程序猿不写代码是不对的16
- Nginx+Tomcat搭建高性能负载均衡集群
- 函数 可变参数
- Spring学习(十)spring mvc入门
- 声音音量
- Android 利用奇虎DroidPlugin实现插件化
- 深入.NET平台和c#理解------第三章上机题员工打卡
- 获取当前分类的顶级分类的分类名称
- nls 字符编码文件对应的国家语言
- HDU1051 Wooden Sticks
- gl_FragCoord的xyzw
- 坐标移动
- Ubuntu无法登录mysql的解决方法——亲测有效
- leecode 解题总结:87. Scramble String