如何使用DroidPlugin——DroidPlugin初體驗


最近研究了下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()[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服務。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM