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

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

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

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

compile project(':DroidPlugin')

加好了之后,gradle(Sync now)一把,就可以了,DroidPlugin被加载成库工程了。

看我的:


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

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

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

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

public class DPApplication extends Application {
@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);
}
}

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

<?xml version="1.0" encoding="utf-8"?>
<manifest package="clwang.chunyu.me.wcl_droid_plugin_demo"
xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:name=".DPApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<action android:name="me.chunyu.clwang.master.action_main"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>

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

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

宿主的MainActivity如下:

public class MainActivity extends AppCompatActivity {
Button btn_plugin_start;
Button btn_plugin_install;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_plugin_install = (Button) findViewById(R.id.btn_plugin_install);
btn_plugin_start = (Button) findViewById(R.id.btn_plugin_start); btn_plugin_install.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!PluginManager.getInstance().isConnected()) {
//return "连接失败"; // 连接失败
Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show();
}
try {
final File files = Environment.getExternalStoragePublicDirectory(Environment
.DIRECTORY_DOWNLOADS);
new Thread(new Runnable() {
@Override
public void run() {
try {
Log.i("============", files.listFiles()[].getPath());
int result = PluginManager.getInstance().installPackage(files
.listFiles()[].getPath(), );
Log.i("=============++++++++", result + "");
} catch (RemoteException e) {
e.printStackTrace();
}
}
}).start(); } catch (Exception e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, "安装失败", Toast.LENGTH_SHORT).show();
} }
});
btn_plugin_start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
gotoPlugin(btn_plugin_start);
}
});
}
private void gotoPlugin(View view) {
if (isServiceAvailable(view.getContext(), PluginConsts.PLUGIN_ACTION_SERVICE)) {
//启动service
Intent intent = new Intent(PluginConsts.PLUGIN_ACTION_SERVICE);
startService(intent);
} else {
Toast.makeText(view.getContext(), "打开失败", Toast.LENGTH_SHORT).show();
}
}
public static boolean isServiceAvailable(Context context, String action) {
Intent intent = new Intent(action);
return context.getPackageManager().resolveService(intent, ) != null;
}
}
这个PluginConsts类是这样的:
/**
* 插件的常量
* <p/>
* Created by wangchenlong on 16/1/15.
*/
public class PluginConsts {
//Service
public static final String PLUGIN_ACTION_SERVICE = "me.chunyu.clwang.plugin.action_service";
}

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

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

public class PluginService extends Service {
public static final String TAG = "PluginService";
String newId;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
} @Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "onCreate() executed");
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "onStartCommand() executed");return super.onStartCommand(intent, flags, startId);
} @Override
public void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy() executed");
Toast.makeText(this,"plugin onDestroy() executed",Toast.LENGTH_SHORT).show();
}
}

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

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

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

最新文章

  1. cf515d
  2. Sql Server建立链接服务器访问Access的MDB数据库
  3. 无法修改系统Host的解决办法
  4. 数据结构(线段树):SPOJ GSS3 - Can you answer these queries III
  5. ubuntu下安装xlrd模块,Mysqldb模块
  6. MAVEN入门(二)
  7. Bootstrap实现弹出框和提示框效果代码
  8. POJ 1470 Closest Common Ancestors(最近公共祖先 LCA)
  9. Sql Server2008如何让外网访问自己的数据库
  10. css 制作翻页布局
  11. liunx存储管理之基础知识
  12. TZOJ 2099 Sightseeing tour(网络流判混合图欧拉回路)
  13. SQLServer数据库循环表操作每一条数据(游标的使用)
  14. beta冲刺7/7
  15. Python Qt的窗体开发的基本操作
  16. 洛谷P2243 电路维修 [最短路]
  17. Unity3D入门基础之游戏对象 (GameObject) 和组件 (Component) 的关系
  18. Eclipse.ini参数设置
  19. STO到底是什么?
  20. .NET重构(五):存储过程、触发器和函数的区别

热门文章

  1. Windows下使用beego遇到的问题
  2. mysql 批量修改 表字段/表/数据库 字符集和排序规则
  3. hibernate课程 初探单表映射3-3 对象类型
  4. html便民查询各个工具类实例代码分享(支持pc和移动端)
  5. Unity3d 游戏中集成Firebase 统计和Admob广告最新中文教程
  6. C#添加删除防火墙例外(程序、端口)
  7. F5-WAF-12.0
  8. cms-数据库设计
  9. IP地址与数字地址相互转换
  10. C++指针的概念解读