最近研究了下360的黑科技--DroidPluginhtml
剛開始不知道怎麼用,因而看了這篇博客:http://www.jianshu.com/p/f1217cce93ef 算是引導了我,因而開始本身寫寫代碼,真正試一把。android
我是從兩種方式來寫的,第一個是把DroidPlugin當成庫工程引入的,第二個是把DroidPlugin打成Jar包來使用的,兩種方式都成功了。git
第一種方式比較簡單方便吧,從gitbub上把DroidPlugin下載下來,在AS中經過 import Module 導入,而後在主工程中(默認是app)的目錄下的build.gradle的dependencies中加入:app
compile project(':DroidPlugin')
加好了以後,gradle(Sync now)一把,就能夠了,DroidPlugin被加載成庫工程了。
看個人:
第二種方式,先要把DroidPlugin打成jar包,能夠參考:http://www.cnblogs.com/IT-Goddess/p/5420682.html ide
打成的jar包只包含類文件,一些用的資源文件是打不進去的,因此要將DroidPlugin用的一些資源文件,複製到宿主中,詳細的到後面再說。gradle
接下來我先講第一種方式的(DEMO是參考別人,而後作了本身的修改)。ui
先建一個類,名爲DPApplication,繼承Application,內容以下:this
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」,以下spa
<?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()[0].getPath()); int result = PluginManager.getInstance().installPackage(files .listFiles()[0].getPath(), 0); 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, 0) != 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服務。