DL插件开发笔记

DL的插件和宿主有三种开发模式,我们这里讨论的是DL插件和宿主程序完全独立的开发模式,至于其余两种,可以到官网了解。

CodeBox客户端就是一个宿主程序,开发插件的同学可以完全不去管宿主是如何开发的。这篇文章也是专门讨论插件的开发。

DL插件开发其实非常简单,只需要修改三个地方。

主题

dl的插件必须每个activity都单独设置主题(插件的作者说的是也可以在application上设置主题),但我实际测试,即使application设置了主题也必须每个activity都单独设置主题。

也就是说这样是不行的:

<application
    android:allowBackup="true"
    android:theme="@android:style/Theme.Holo.Light"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:name=".SampleActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

必须这样:

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:name=".SampleActivity"
        android:theme="@android:style/Theme.Holo.Light.DarkActionBar" 
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

注意的是 插件只能用系统主题 不能直接定义主题

不能这样

android:theme="@style/AppTheme"

只能这样

android:theme="@android:style/Theme.Light"

虽然在某些插件上可能不按照此规则也可以正确运行 ,但是我试过绝大多数多需要满足此条件。

引入DL库

先下载DL库

https://github.com/singwhatiwanna/dynamic-load-apk

将下载的源码导入eclipse,找到lib 目录下的工程,如果eclipse是自动编译的,应该在lib的bin里面就有了dl-lib.jar,我们需要的就是这个。  

因为DL插件需要用到DL库的类(),所以需要引入DL库,但是插件是最终要加载到宿主程序中的,宿主程序中也是引入了DL库的,如果常规办法导入DL库,则会有两份DL的拷贝,为了解决这个问题,我们让插件中的DL只是编译的时候用,但是不打包进apk。如何让它参与编译却不被打包进apk呢?在Eclipse中可以这样做:

只需要在插件工程中创建一个目录,比如external-jars,然后把dl-lib.jar和放进去,同时在.classpath中追加如下代码即可:

<classpathentry kind="lib" path="external-jars/dl-lib.jar"/>

同样的如果宿主程序中用了support-v4.jar,那么插件中原有的support-v4.jar也不能被打包进去,也需要将support-v4.jar放到external-jars同时追加

<classpathentry kind="lib" path="external-jars/android-support-v4.jar"/>

CodeBox宿主是用了support-v4.jar的。

插件的java代码修改

插件中的所有Activity 必须是继承自DLBasePluginActivity或者是DLBasePluginFragmentActivity。如果原有的为Activity,这里需要改为继承DLBasePluginActivity,如果原来为FragmentActivity,那么需要继承DLBasePluginFragmentActivity。

继承DLBasePluginActivity

public class MainActivity extends DLBasePluginActivity

继承DLBasePluginFragmentActivity

TestFragmentActivity extends DLBasePluginFragmentActivity

另外原有activity中所有代表context引用的this都必须改写为that

如果要调用另外一个activity,不能使用startActivity(),而是使用startPluginActivity,并且intent也要变为DLIntent

DLIntent intent = new DLIntent(getPackageName(), ListActivity.class);
intent.putExtra(TYPE, item.getNavigationInfo());
startPluginActivity(intent);