最近研究了下360的黑科技--DroidPlugin

刚开始不知道怎么用,于是看了这篇博客:http://www.jianshu.com/p/f1217cce93ef  算是引导了我,于是开始自己写写代码,真正试一把。

我是从两种方式来写的,第一个是把DroidPlugin当成库工程引入的,第二个是把DroidPlugin打成Jar包来使用的,两种方式都成功了。

第一种方式比较简单方便吧,从gitbub上把DroidPlugin下载下来,在AS中通过 import Module 导入,然后在主工程中(默认是app)的目录下的build.gradle的dependencies中加入:

  1. compile project(':DroidPlugin')
  2.  
  3. 加好了之后,gradleSync now)一把,就可以了,DroidPlugin被加载成库工程了。
  4.  
  5. 看我的:
  6.  

第二种方式,先要把DroidPlugin打成jar包,可以参考:http://www.cnblogs.com/IT-Goddess/p/5420682.html

打成的jar包只包含类文件,一些用的资源文件是打不进去的,所以要将DroidPlugin用的一些资源文件,复制到宿主中,详细的到后面再说。

接下来我先讲第一种方式的(DEMO是参考别人,然后做了自己的修改)。

先建一个类,名为DPApplication,继承Application,内容如下:

  1. public class DPApplication extends Application {
  2. @Override
  3. public void onCreate() {
  4. super.onCreate();
  5. // 这里必须在super.onCreate方法之后,顺序不能变
  6. PluginHelper.getInstance().applicationOnCreate(getBaseContext());
  7. }
  8.  
  9. @Override
  10. protected void attachBaseContext(Context base) {
  11. PluginHelper.getInstance().applicationAttachBaseContext(base);
  12. super.attachBaseContext(base);
  13. }
  14. }

建好了之后,在AndroidManifest.xml中,把Application节点的name改成“.DPApplication”,如下

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest package="clwang.chunyu.me.wcl_droid_plugin_demo"
  3. xmlns:android="http://schemas.android.com/apk/res/android">
  4. <application
  5. android:name=".DPApplication"
  6. android:allowBackup="true"
  7. android:icon="@mipmap/ic_launcher"
  8. android:label="@string/app_name"
  9. android:supportsRtl="true"
  10. android:theme="@style/AppTheme">
  11. <activity android:name=".MainActivity">
  12. <intent-filter>
  13. <action android:name="android.intent.action.MAIN"/>
  14. <action android:name="me.chunyu.clwang.master.action_main"/>
  15. <category android:name="android.intent.category.DEFAULT"/>
  16. <category android:name="android.intent.category.LAUNCHER"/>
  17. </intent-filter>
  18. </activity>
  19. </application>
  20. </manifest>

以上过程是在宿主程序中的,基本的配置工作就这样了。

现在我要实现的是:在宿主中开启插件的某个服务

宿主的MainActivity如下:

  1. public class MainActivity extends AppCompatActivity {
  2. Button btn_plugin_start;
  3. Button btn_plugin_install;
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. btn_plugin_install = (Button) findViewById(R.id.btn_plugin_install);
  9. btn_plugin_start = (Button) findViewById(R.id.btn_plugin_start);
  10.  
  11. btn_plugin_install.setOnClickListener(new View.OnClickListener() {
  12. @Override
  13. public void onClick(View v) {
  14. if (!PluginManager.getInstance().isConnected()) {
  15. //return "连接失败"; // 连接失败
  16. Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show();
  17. }
  18. try {
  19. final File files = Environment.getExternalStoragePublicDirectory(Environment
  20. .DIRECTORY_DOWNLOADS);
  21. new Thread(new Runnable() {
  22. @Override
  23. public void run() {
  24. try {
  25. Log.i("============", files.listFiles()[].getPath());
  26. int result = PluginManager.getInstance().installPackage(files
  27. .listFiles()[].getPath(), );
  28. Log.i("=============++++++++", result + "");
  29. } catch (RemoteException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. }).start();
  34.  
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. Toast.makeText(MainActivity.this, "安装失败", Toast.LENGTH_SHORT).show();
  38. }
  39.  
  40. }
  41. });
  42. btn_plugin_start.setOnClickListener(new View.OnClickListener() {
  43. @Override
  44. public void onClick(View v) {
  45. gotoPlugin(btn_plugin_start);
  46. }
  47. });
  48. }
  49. private void gotoPlugin(View view) {
  50. if (isServiceAvailable(view.getContext(), PluginConsts.PLUGIN_ACTION_SERVICE)) {
  51. //启动service
  52. Intent intent = new Intent(PluginConsts.PLUGIN_ACTION_SERVICE);
  53. startService(intent);
  54. } else {
  55. Toast.makeText(view.getContext(), "打开失败", Toast.LENGTH_SHORT).show();
  56. }
  57. }
  58. public static boolean isServiceAvailable(Context context, String action) {
  59. Intent intent = new Intent(action);
  60. return context.getPackageManager().resolveService(intent, ) != null;
  61. }
  62. }
  1. 这个PluginConsts类是这样的:
  1. /**
  2. * 插件的常量
  3. * <p/>
  4. * Created by wangchenlong on 16/1/15.
  5. */
  6. public class PluginConsts {
    //Service
  7. public static final String PLUGIN_ACTION_SERVICE = "me.chunyu.clwang.plugin.action_service";
  8. }

宿主中就是这样的,接下来看下插件:

插件中有个服务,叫PluginService,如下:

  1. public class PluginService extends Service {
  2. public static final String TAG = "PluginService";
  3. String newId;
  4. @Nullable
  5. @Override
  6. public IBinder onBind(Intent intent) {
  7. return null;
  8. }
  9.  
  10. @Override
  11. public void onCreate() {
  12. super.onCreate();
  13. Log.i(TAG, "onCreate() executed");
  14. }
  15.  
  16. @Override
  17. public int onStartCommand(Intent intent, int flags, int startId) {
  18. Log.i(TAG, "onStartCommand() executed");return super.onStartCommand(intent, flags, startId);
  19. }
  20.  
  21. @Override
  22. public void onDestroy() {
  23. super.onDestroy();
  24. Log.i(TAG, "onDestroy() executed");
  25. Toast.makeText(this,"plugin onDestroy() executed",Toast.LENGTH_SHORT).show();
  26. }
  27. }

然后在插件的AndroidManifest.xml文件中注册下这个服务:

  1. <service android:name=".PluginService">
  2. <intent-filter>
  3. <action android:name="me.chunyu.clwang.plugin.action_service"></action>
  4. </intent-filter>
  5. </service>

把插件APK放到sdcard下的Download文件夹中,到这就可以了,先安装插件,在开启插件的PluginService服务。

如何使用DroidPlugin——DroidPlugin初体验的更多相关文章

  1. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  2. Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

    Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...

  3. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

  4. Xamarin.iOS开发初体验

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0

  5. 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...

  6. 【Knockout.js 学习体验之旅】(1)ko初体验

    前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...

  7. 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验

    在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...

  8. 百度EChart3初体验

    由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...

  9. Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验

    Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...

  10. Docker初体验

    ## Docker初体验 安装 因为我用的是mac,所以安装很简单,下载dmg下来之后拖拽安装即可完成. 需要注意的就是由于之前的docker是基于linux开发,不支持mac,所以就出现了docke ...

随机推荐

  1. JavaScript随机生成颜色以及十六进制颜色 与RGB颜色值的相互转换

    /** * 随机生成颜色 * @return 随机生成的十六进制颜色 */ function randomColor(){ var colorStr=Math.floor(Math.random()* ...

  2. chart.js 使用方法 特别说明不是中文的

    以上是一个饼图的案例,其他统计类型查看文档 http://www.chartjs.org/docs/latest/charts/doughnut.html 注意看域名 chartjs.org  不是 ...

  3. path的join和resolve

    连接路径:path.join([path1][, path2][, ...]) path.join()方法可以连接任意多个路径字符串.要连接的多个路径可做为参数传入. path.join()方法在接边 ...

  4. Java开发工具IntelliJ IDEA创建Andriod项目示例说明

    IntelliJ IDEA社区版作为一个轻量级的Java开发IDE,是一个开箱即用的Android开发工具. 注意:在本次的教程中我们将以Android平台2.2为例进行IntelliJ IDEA的使 ...

  5. Retrofit 2.0 轻松实现多文件/图片上传/Json字符串/表单

    如果嫌麻烦直接可以用我封装好的库:Novate: https://github.com/Tamicer/Novate 通过对Retrofit2.0的前两篇的基础入门和案例实践,掌握了怎么样使用Retr ...

  6. mysql数据库字段类型的选择原则

    原文链接:http://blog.csdn.net/u013412790/article/details/51615407 数据库类型的选择对数据库的性能影响很大 1 . 数据类型会影响存储空间的开销 ...

  7. oracle最高账号sys的密码认证模式

    CONNECT USERNAME/PASSWORD@SERVERNAME AS SYSDBAconnect 是指连接到username是指用户名password是指密码servername是指服务名a ...

  8. Check-Point-Security-Gateway-BYOL-R77.30-041.161

    平台: CentOS 类型: 虚拟机镜像 软件包: checkpoint redhat smartconsole basic software security vfw 服务优惠价: 按服务商许可协议 ...

  9. 汇编:jmp系列跳转指令总结

    助记方法: J:跳转C: 进位位置位N: 否S: 符号位置位o: 溢出位置位Z: 零标志位置位E: 等于P:奇偶位置位A: AboveB: BelowL: Less (Little的比较级)G: Gr ...

  10. js 生成随机数解决缓存的问题

    对于缓存有一个解决方法是在链接后添加随机数 例如登陆后跳转到链接/home,但是有缓存上次用户的登陆名,于是在/home后面加上一个随机数 var href = '/home?'+Math.rando ...