diff --git a/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLBasePluginActivity.java b/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLBasePluginActivity.java index 926c68a..b247f33 100644 --- a/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLBasePluginActivity.java +++ b/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLBasePluginActivity.java @@ -38,6 +38,7 @@ import android.view.Window; import android.view.WindowManager; +import com.ryg.dynamicload.internal.DLActivityPlugin; import com.ryg.dynamicload.internal.DLIntent; import com.ryg.dynamicload.internal.DLPluginManager; import com.ryg.dynamicload.internal.DLPluginPackage; @@ -49,7 +50,7 @@ * @see {@link DLBasePluginActivity.that} * @author renyugang */ -public class DLBasePluginActivity extends Activity implements DLPlugin { +public class DLBasePluginActivity extends Activity implements DLActivityPlugin { private static final String TAG = "DLBasePluginActivity"; @@ -89,7 +90,8 @@ public void onCreate(Bundle savedInstanceState) { mPluginManager = DLPluginManager.getInstance(that); Log.d(TAG, "onCreate: from= " - + (mFrom == DLConstants.FROM_INTERNAL ? "DLConstants.FROM_INTERNAL" : "FROM_EXTERNAL")); + + (mFrom == DLConstants.FROM_INTERNAL ? "DLConstants.FROM_INTERNAL" + : "FROM_EXTERNAL")); } @Override @@ -385,7 +387,7 @@ public int startPluginActivityForResult(DLIntent dlIntent, int requestCode) { } return mPluginManager.startPluginActivityForResult(that, dlIntent, requestCode); } - + public int startPluginService(DLIntent dlIntent) { if (mFrom == DLConstants.FROM_EXTERNAL) { if (dlIntent.getPluginPackage() == null) { @@ -394,7 +396,7 @@ public int startPluginService(DLIntent dlIntent) { } return mPluginManager.startPluginService(that, dlIntent); } - + public int bindPluginService(DLIntent dlIntent, ServiceConnection conn, int flags) { if (mFrom == DLConstants.FROM_EXTERNAL) { if (dlIntent.getPluginPackage() == null) { @@ -403,41 +405,42 @@ public int bindPluginService(DLIntent dlIntent, ServiceConnection conn, int flag } return mPluginManager.bindPluginService(that, dlIntent, conn, flags); } - + public int unBindPluginService(DLIntent dlIntent, ServiceConnection conn) { if (mFrom == DLConstants.FROM_EXTERNAL) { if (dlIntent.getPluginPackage() == null) - dlIntent.setPluginPackage(mPluginPackage.packageName); + dlIntent.setPluginPackage(mPluginPackage.packageName); } return mPluginManager.unBindPluginService(that, dlIntent, conn); } -// /** -// * 直接调用that.startService -// * that 可能有两种情况 -// * 1.指向this -// * 2.指向DLProxyActivity -// */ -// public ComponentName startService(Intent service) { -// return that.startService(service); -// } -// -// @Override -// public boolean stopService(Intent name) { -// // TODO Auto-generated method stub -// return super.stopService(name); -// } -// -// @Override -// public boolean bindService(Intent service, ServiceConnection conn, int flags) { -// // TODO Auto-generated method stub -// return super.bindService(service, conn, flags); -// } -// -// @Override -// public void unbindService(ServiceConnection conn) { -// // TODO Auto-generated method stub -// super.unbindService(conn); -// } + // /** + // * 直接调用that.startService + // * that 可能有两种情况 + // * 1.指向this + // * 2.指向DLProxyActivity + // */ + // public ComponentName startService(Intent service) { + // return that.startService(service); + // } + // + // @Override + // public boolean stopService(Intent name) { + // // TODO Auto-generated method stub + // return super.stopService(name); + // } + // + // @Override + // public boolean bindService(Intent service, ServiceConnection conn, int + // flags) { + // // TODO Auto-generated method stub + // return super.bindService(service, conn, flags); + // } + // + // @Override + // public void unbindService(ServiceConnection conn) { + // // TODO Auto-generated method stub + // super.unbindService(conn); + // } } diff --git a/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLBasePluginFragmentActivity.java b/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLBasePluginFragmentActivity.java index 3b4357d..9d35717 100644 --- a/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLBasePluginFragmentActivity.java +++ b/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLBasePluginFragmentActivity.java @@ -15,6 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.ryg.dynamicload; import android.app.Activity; @@ -39,12 +40,13 @@ import android.view.Window; import android.view.WindowManager; +import com.ryg.dynamicload.internal.DLActivityPlugin; import com.ryg.dynamicload.internal.DLIntent; import com.ryg.dynamicload.internal.DLPluginManager; import com.ryg.dynamicload.internal.DLPluginPackage; import com.ryg.utils.DLConstants; -public class DLBasePluginFragmentActivity extends FragmentActivity implements DLPlugin { +public class DLBasePluginFragmentActivity extends FragmentActivity implements DLActivityPlugin { private static final String TAG = "DLBasePluginFragmentActivity"; @@ -83,7 +85,8 @@ public void onCreate(Bundle savedInstanceState) { mPluginManager = DLPluginManager.getInstance(that); Log.d(TAG, "onCreate: from= " - + (mFrom == DLConstants.FROM_INTERNAL ? "DLConstants.FROM_INTERNAL" : "FROM_EXTERNAL")); + + (mFrom == DLConstants.FROM_INTERNAL ? "DLConstants.FROM_INTERNAL" + : "FROM_EXTERNAL")); } @Override @@ -357,8 +360,9 @@ public boolean onOptionsItemSelected(MenuItem item) { /** * @param dlIntent - * @return may be {@link #START_RESULT_SUCCESS}, {@link #START_RESULT_NO_PKG}, - * {@link #START_RESULT_NO_CLASS}, {@link #START_RESULT_TYPE_ERROR} + * @return may be {@link #START_RESULT_SUCCESS}, + * {@link #START_RESULT_NO_PKG}, {@link #START_RESULT_NO_CLASS}, + * {@link #START_RESULT_TYPE_ERROR} */ public int startPluginActivity(DLIntent dlIntent) { return startPluginActivityForResult(dlIntent, -1); @@ -366,8 +370,9 @@ public int startPluginActivity(DLIntent dlIntent) { /** * @param dlIntent - * @return may be {@link #START_RESULT_SUCCESS}, {@link #START_RESULT_NO_PKG}, - * {@link #START_RESULT_NO_CLASS}, {@link #START_RESULT_TYPE_ERROR} + * @return may be {@link #START_RESULT_SUCCESS}, + * {@link #START_RESULT_NO_PKG}, {@link #START_RESULT_NO_CLASS}, + * {@link #START_RESULT_TYPE_ERROR} */ public int startPluginActivityForResult(DLIntent dlIntent, int requestCode) { if (mFrom == DLConstants.FROM_EXTERNAL) { @@ -377,7 +382,7 @@ public int startPluginActivityForResult(DLIntent dlIntent, int requestCode) { } return mPluginManager.startPluginActivityForResult(that, dlIntent, requestCode); } - + public int startPluginService(DLIntent dlIntent) { if (mFrom == DLConstants.FROM_EXTERNAL) { if (dlIntent.getPluginPackage() == null) { @@ -386,7 +391,7 @@ public int startPluginService(DLIntent dlIntent) { } return mPluginManager.startPluginService(that, dlIntent); } - + public int bindPluginService(DLIntent dlIntent, ServiceConnection conn, int flags) { if (mFrom == DLConstants.FROM_EXTERNAL) { if (dlIntent.getPluginPackage() == null) { @@ -395,11 +400,11 @@ public int bindPluginService(DLIntent dlIntent, ServiceConnection conn, int flag } return mPluginManager.bindPluginService(that, dlIntent, conn, flags); } - + public int unBindPluginService(DLIntent dlIntent, ServiceConnection conn) { if (mFrom == DLConstants.FROM_EXTERNAL) { if (dlIntent.getPluginPackage() == null) - dlIntent.setPluginPackage(mPluginPackage.packageName); + dlIntent.setPluginPackage(mPluginPackage.packageName); } return mPluginManager.unBindPluginService(that, dlIntent, conn); } diff --git a/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLBasePluginService.java b/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLBasePluginService.java index eaad418..51255db 100644 --- a/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLBasePluginService.java +++ b/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLBasePluginService.java @@ -24,6 +24,7 @@ import android.os.IBinder; import com.ryg.dynamicload.internal.DLPluginPackage; +import com.ryg.dynamicload.internal.DLServicePlugin; import com.ryg.utils.DLConstants; import com.ryg.utils.LOG; @@ -31,13 +32,12 @@ public class DLBasePluginService extends Service implements DLServicePlugin { public static final String TAG = "DLBasePluginService"; private Service mProxyService; - private DLPluginPackage mPluginPackage; + protected DLPluginPackage mPluginPackage; protected Service that = this; protected int mFrom = DLConstants.FROM_INTERNAL; @Override public void attach(Service proxyService, DLPluginPackage pluginPackage) { - // TODO Auto-generated method stub LOG.d(TAG, TAG + " attach"); mProxyService = proxyService; mPluginPackage = pluginPackage; @@ -51,65 +51,55 @@ protected boolean isInternalCall() { @Override public IBinder onBind(Intent intent) { - // TODO Auto-generated method stub LOG.d(TAG, TAG + " onBind"); return null; } @Override public void onCreate() { - // TODO Auto-generated method stub LOG.d(TAG, TAG + " onCreate"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { - // TODO Auto-generated method stub LOG.d(TAG, TAG + " onStartCommand"); return 0; } @Override public void onDestroy() { - // TODO Auto-generated method stub LOG.d(TAG, TAG + " onDestroy"); } @Override public void onConfigurationChanged(Configuration newConfig) { - // TODO Auto-generated method stub LOG.d(TAG, TAG + " onConfigurationChanged"); } @Override public void onLowMemory() { - // TODO Auto-generated method stub LOG.d(TAG, TAG + " onLowMemory"); } @Override public void onTrimMemory(int level) { - // TODO Auto-generated method stub LOG.d(TAG, TAG + " onTrimMemory"); } @Override public boolean onUnbind(Intent intent) { - // TODO Auto-generated method stub LOG.d(TAG, TAG + " onUnbind"); return false; } @Override public void onRebind(Intent intent) { - // TODO Auto-generated method stub LOG.d(TAG, TAG + " onRebind"); } @Override public void onTaskRemoved(Intent rootIntent) { - // TODO Auto-generated method stub LOG.d(TAG, TAG + " onTaskRemoved"); } diff --git a/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLPlugin.java b/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLActivityPlugin.java similarity index 90% rename from DynamicLoadApk/lib/src/com/ryg/dynamicload/DLPlugin.java rename to DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLActivityPlugin.java index e5458eb..eac72d2 100644 --- a/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLPlugin.java +++ b/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLActivityPlugin.java @@ -15,7 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.ryg.dynamicload; +package com.ryg.dynamicload.internal; import android.app.Activity; import android.content.Intent; @@ -26,9 +26,7 @@ import android.view.MotionEvent; import android.view.WindowManager.LayoutParams; -import com.ryg.dynamicload.internal.DLPluginPackage; - -public interface DLPlugin { +public interface DLActivityPlugin extends DLAttachable{ public void onCreate(Bundle savedInstanceState); public void onStart(); @@ -38,7 +36,6 @@ public interface DLPlugin { public void onPause(); public void onStop(); public void onDestroy(); - public void attach(Activity proxyActivity, DLPluginPackage pluginPackage); public void onSaveInstanceState(Bundle outState); public void onNewIntent(Intent intent); public void onRestoreInstanceState(Bundle savedInstanceState); diff --git a/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLAttachable.java b/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLAttachable.java index 8457f20..d88a8a5 100644 --- a/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLAttachable.java +++ b/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLAttachable.java @@ -18,22 +18,21 @@ package com.ryg.dynamicload.internal; -import com.ryg.dynamicload.DLPlugin; - /** - * @author mrsimple + * 这是一个通用的attach接口,所有的组件都使用该接口即可 */ -public interface DLAttachable { +public interface DLAttachable { /** * when the proxy impl ( {@see DLProxyImpl#launchTargetActivity()} ) launch - * the plugin activity , dl will call this method to attach the proxy activity - * and pluginManager to the plugin activity. the proxy activity will load - * the plugin's resource, so the proxy activity is a resource delegate for - * plugin activity. + * the plugin activity , dl will call this method to attach the proxy + * activity and pluginManager to the plugin activity. the proxy activity + * will load the plugin's resource, so the proxy activity is a resource + * delegate for plugin activity. * - * @param proxyActivity a instance of DLPlugin, {@see DLBasePluginActivity} - * and {@see DLBasePluginFragmentActivity} + * @param proxyComponent a instance of DLPlugin, {@see DLBasePluginActivity} + * and {@see DLBasePluginFragmentActivity}, {@see + * DLBasePluginService} * @param pluginManager DLPluginManager instance, manager the plugins */ - public void attach(DLPlugin proxyActivity, DLPluginManager pluginManager); + public void attach(T proxyComponent, DLPluginPackage pluginManager); } diff --git a/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLPluginManager.java b/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLPluginManager.java index cbfb355..10a3fba 100644 --- a/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLPluginManager.java +++ b/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLPluginManager.java @@ -38,9 +38,9 @@ import com.ryg.dynamicload.DLBasePluginActivity; import com.ryg.dynamicload.DLBasePluginFragmentActivity; import com.ryg.dynamicload.DLBasePluginService; -import com.ryg.dynamicload.DLProxyActivity; -import com.ryg.dynamicload.DLProxyFragmentActivity; -import com.ryg.dynamicload.DLProxyService; +import com.ryg.dynamicload.proxy.DLActivityProxy; +import com.ryg.dynamicload.proxy.DLFragmentActivityProxy; +import com.ryg.dynamicload.proxy.DLServiceProxy; import com.ryg.utils.DLConstants; import com.ryg.utils.SoLibManager; @@ -399,9 +399,9 @@ private String getPluginActivityFullPath(DLIntent dlIntent, DLPluginPackage plug private Class getProxyActivityClass(Class clazz) { Class activityClass = null; if (DLBasePluginActivity.class.isAssignableFrom(clazz)) { - activityClass = DLProxyActivity.class; + activityClass = DLActivityProxy.class; } else if (DLBasePluginFragmentActivity.class.isAssignableFrom(clazz)) { - activityClass = DLProxyFragmentActivity.class; + activityClass = DLFragmentActivityProxy.class; } return activityClass; @@ -410,7 +410,7 @@ private Class getProxyActivityClass(Class clazz) { private Class getProxyServiceClass(Class clazz) { Class proxyServiceClass = null; if (DLBasePluginService.class.isAssignableFrom(clazz)) { - proxyServiceClass = DLProxyService.class; + proxyServiceClass = DLServiceProxy.class; } // 后续可能还有IntentService,待补充 diff --git a/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLServiceAttachable.java b/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLServiceAttachable.java deleted file mode 100644 index b14ca72..0000000 --- a/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLServiceAttachable.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2014 singwhatiwanna(任玉刚) - * - * collaborator:田啸,宋思宇,Mr.Simple - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.ryg.dynamicload.internal; - -import com.ryg.dynamicload.DLServicePlugin; - -/** - * @author mrsimple - */ -public interface DLServiceAttachable { - - public void attach(DLServicePlugin remoteService, DLPluginManager pluginManager); -} diff --git a/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLServicePlugin.java b/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLServicePlugin.java similarity index 90% rename from DynamicLoadApk/lib/src/com/ryg/dynamicload/DLServicePlugin.java rename to DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLServicePlugin.java index 69a61f3..45f7f55 100644 --- a/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLServicePlugin.java +++ b/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLServicePlugin.java @@ -1,4 +1,4 @@ -package com.ryg.dynamicload; +package com.ryg.dynamicload.internal; import android.app.Service; @@ -6,8 +6,6 @@ import android.content.res.Configuration; import android.os.IBinder; -import com.ryg.dynamicload.internal.DLPluginPackage; - public interface DLServicePlugin { public void onCreate(); diff --git a/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLServiceProxyImpl.java b/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLServiceProxyImpl.java deleted file mode 100644 index c90de93..0000000 --- a/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLServiceProxyImpl.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.ryg.dynamicload.internal; - -import java.lang.reflect.Constructor; - -import com.ryg.dynamicload.DLServicePlugin; -import com.ryg.utils.DLConfigs; -import com.ryg.utils.DLConstants; - -import android.annotation.TargetApi; -import android.app.Service; -import android.content.Intent; -import android.os.Build; -import android.os.Bundle; -import android.util.Log; - -public class DLServiceProxyImpl { - - private static final String TAG = "DLServiceProxyImpl"; - private Service mProxyService; - private DLServicePlugin mRemoteService; - - public DLServiceProxyImpl(Service service) { - mProxyService = service; - } - - @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) - public void init(Intent intent) { - // set the extra's class loader - intent.setExtrasClassLoader(DLConfigs.sPluginClassloader); - - String packageName = intent.getStringExtra(DLConstants.EXTRA_PACKAGE); - String clazz = intent.getStringExtra(DLConstants.EXTRA_CLASS); - Log.d(TAG, "clazz=" + clazz + " packageName=" + packageName); - - DLPluginManager pluginManager = DLPluginManager.getInstance(mProxyService); - DLPluginPackage pluginPackage = pluginManager.getPackage(packageName); - - try { - Class localClass = pluginPackage.classLoader.loadClass(clazz); - Constructor localConstructor = localClass.getConstructor(new Class[] {}); - Object instance = localConstructor.newInstance(new Object[] {}); - mRemoteService = (DLServicePlugin) instance; - ((DLServiceAttachable) mProxyService).attach(mRemoteService, pluginManager); - Log.d(TAG, "instance = " + instance); - // attach the proxy activity and plugin package to the - // mPluginActivity - mRemoteService.attach(mProxyService, pluginPackage); - - Bundle bundle = new Bundle(); - bundle.putInt(DLConstants.FROM, DLConstants.FROM_EXTERNAL); - mRemoteService.onCreate(); - } catch (Exception e) { - e.printStackTrace(); - } - } - -} diff --git a/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLProxyImpl.java b/DynamicLoadApk/lib/src/com/ryg/dynamicload/loader/DLActivityLoader.java similarity index 58% rename from DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLProxyImpl.java rename to DynamicLoadApk/lib/src/com/ryg/dynamicload/loader/DLActivityLoader.java index ffe5468..5be2d23 100644 --- a/DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLProxyImpl.java +++ b/DynamicLoadApk/lib/src/com/ryg/dynamicload/loader/DLActivityLoader.java @@ -16,9 +16,8 @@ * limitations under the License. */ -package com.ryg.dynamicload.internal; +package com.ryg.dynamicload.loader; -import android.annotation.TargetApi; import android.app.Activity; import android.content.Intent; import android.content.pm.ActivityInfo; @@ -30,11 +29,7 @@ import android.os.Bundle; import android.util.Log; -import com.ryg.dynamicload.DLPlugin; -import com.ryg.utils.DLConfigs; -import com.ryg.utils.DLConstants; - -import java.lang.reflect.Constructor; +import com.ryg.dynamicload.internal.DLActivityPlugin; /** * This is a plugin activity proxy, the proxy will create the plugin activity @@ -43,40 +38,29 @@ * * @author mrsimple */ -public class DLProxyImpl { - - private static final String TAG = "DLProxyImpl"; - - private String mClass; - private String mPackageName; - - private DLPluginPackage mPluginPackage; - private DLPluginManager mPluginManager; +public class DLActivityLoader extends DLBaseLoader { private AssetManager mAssetManager; private Resources mResources; private Theme mTheme; private ActivityInfo mActivityInfo; - private Activity mProxyActivity; - protected DLPlugin mPluginActivity; - public ClassLoader mPluginClassLoader; - public DLProxyImpl(Activity activity) { - mProxyActivity = activity; + public DLActivityLoader(Activity activity) { + mProxyComponent = activity; } private void initializeActivityInfo() { PackageInfo packageInfo = mPluginPackage.packageInfo; if ((packageInfo.activities != null) && (packageInfo.activities.length > 0)) { - if (mClass == null) { - mClass = packageInfo.activities[0].name; + if (mPluginClazz == null) { + mPluginClazz = packageInfo.activities[0].name; } - //Finals 修复主题BUG + // Finals 修复主题BUG int defaultTheme = packageInfo.applicationInfo.theme; for (ActivityInfo a : packageInfo.activities) { - if (a.name.equals(mClass)) { + if (a.name.equals(mPluginClazz)) { mActivityInfo = a; // Finals ADD 修复主题没有配置的时候插件异常 if (mActivityInfo.theme == 0) { @@ -99,9 +83,10 @@ private void initializeActivityInfo() { private void handleActivityInfo() { Log.d(TAG, "handleActivityInfo, theme=" + mActivityInfo.theme); if (mActivityInfo.theme > 0) { - mProxyActivity.setTheme(mActivityInfo.theme); + mProxyComponent.setTheme(mActivityInfo.theme); } - Theme superTheme = mProxyActivity.getTheme(); + + Theme superTheme = mProxyComponent.getTheme(); mTheme = mResources.newTheme(); mTheme.setTo(superTheme); // Finals适配三星以及部分加载XML出现异常BUG @@ -110,47 +95,16 @@ private void handleActivityInfo() { } catch (Exception e) { e.printStackTrace(); } - // TODO: handle mActivityInfo.launchMode here in the future. } - public void onCreate(Intent intent) { - - // set the extra's class loader - intent.setExtrasClassLoader(DLConfigs.sPluginClassloader); - - mPackageName = intent.getStringExtra(DLConstants.EXTRA_PACKAGE); - mClass = intent.getStringExtra(DLConstants.EXTRA_CLASS); - Log.d(TAG, "mClass=" + mClass + " mPackageName=" + mPackageName); - - mPluginManager = DLPluginManager.getInstance(mProxyActivity); - mPluginPackage = mPluginManager.getPackage(mPackageName); + @Override + protected void init(Intent intent) { + super.init(intent); mAssetManager = mPluginPackage.assetManager; mResources = mPluginPackage.resources; - initializeActivityInfo(); handleActivityInfo(); - launchTargetActivity(); - } - - @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) - protected void launchTargetActivity() { - try { - Class localClass = getClassLoader().loadClass(mClass); - Constructor localConstructor = localClass.getConstructor(new Class[] {}); - Object instance = localConstructor.newInstance(new Object[] {}); - mPluginActivity = (DLPlugin) instance; - ((DLAttachable) mProxyActivity).attach(mPluginActivity, mPluginManager); - Log.d(TAG, "instance = " + instance); - // attach the proxy activity and plugin package to the mPluginActivity - mPluginActivity.attach(mProxyActivity, mPluginPackage); - - Bundle bundle = new Bundle(); - bundle.putInt(DLConstants.FROM, DLConstants.FROM_EXTERNAL); - mPluginActivity.onCreate(bundle); - } catch (Exception e) { - e.printStackTrace(); - } } public ClassLoader getClassLoader() { @@ -169,7 +123,12 @@ public Theme getTheme() { return mTheme; } - public DLPlugin getRemoteActivity() { - return mPluginActivity; + public DLActivityPlugin getRemoteActivity() { + return mPlugin; + } + + @Override + protected void callPluginOnCreate(Bundle bundle) { + mPlugin.onCreate(bundle); } } diff --git a/DynamicLoadApk/lib/src/com/ryg/dynamicload/loader/DLBaseLoader.java b/DynamicLoadApk/lib/src/com/ryg/dynamicload/loader/DLBaseLoader.java new file mode 100644 index 0000000..924759b --- /dev/null +++ b/DynamicLoadApk/lib/src/com/ryg/dynamicload/loader/DLBaseLoader.java @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2014 singwhatiwanna(任玉刚) + * + * collaborator:田啸,宋思宇,Mr.Simple + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.ryg.dynamicload.loader; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; + +import com.ryg.dynamicload.internal.DLAttachable; +import com.ryg.dynamicload.internal.DLPluginManager; +import com.ryg.dynamicload.internal.DLPluginPackage; +import com.ryg.utils.DLConfigs; +import com.ryg.utils.DLConstants; + +import java.lang.reflect.Constructor; + +/** + * 插件加载器基类,负责构建、加载插件组件,并且与代理组件建立关联关系 + * + * @author mrsimple + * @param

组件代理类型,例如DLProxyActivity,DLProxyService等 + * @param Plugin类型,例如{@see DLPlugin},{@see DLServicePlugin} + */ +@SuppressWarnings("unchecked") +public abstract class DLBaseLoader

{ + + /** + * 组件类型,例如Service,Activity等 + */ + protected P mProxyComponent; + + /** + * 插件组件,例如DLBasePluginActivity的子类、DLBasePluginService子类等 + */ + protected T mPlugin; + + // 插件的包名 + protected String mPackageName; + // 插件的Service的类名 + protected String mPluginClazz; + // 插件管理器 + protected DLPluginManager mPluginManager; + // 插件DLPluginPackage + protected DLPluginPackage mPluginPackage; + // Log's TAG + protected final String TAG = this.getClass().getName(); + + /** + * 创建组件,并且调用组件的onCreate方法 + * + * @param intent + */ + public final void onCreate(Intent intent) { + try { + // 1、初始化插件包名、类名等属性 + init(intent); + // 2、反射构造插件对象 + mPlugin = createPlugin(mPluginPackage.classLoader); + // 3、调用插件代理对象的attach方法,将插件注入到代理对象中 + attachPluginToProxy(); + // 4、调用插件的attach、onCreate方法启动插件 + callOnCreate(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + protected void init(Intent intent) { + // set the extra's class loader + intent.setExtrasClassLoader(DLConfigs.sPluginClassloader); + // 插件的包名 + mPackageName = intent.getStringExtra(DLConstants.EXTRA_PACKAGE); + // 插件的Service的类名 + mPluginClazz = intent.getStringExtra(DLConstants.EXTRA_CLASS); + mPluginManager = DLPluginManager.getInstance(mProxyComponent); + mPluginPackage = mPluginManager.getPackage(mPackageName); + } + + protected T createPlugin(ClassLoader classLoader) + throws Exception { + Log.d(TAG, "clazz=" + mPluginClazz + " packageName=" + mPackageName); + Class localClass = classLoader.loadClass(mPluginClazz); + Constructor localConstructor = localClass.getConstructor(new Class[] {}); + return (T) localConstructor.newInstance(new Object[] {}); + } + + /** + * 调用代理对象的attach + */ + private void attachPluginToProxy() { + ((DLAttachable) mProxyComponent).attach(mPlugin, mPluginPackage); + } + + /** + * 调用插件的attach和onCreate函数,启动插件 + */ + private void callOnCreate() { + // 调用插件的attach,将Proxy组件注入到插件对象中 + ((DLAttachable

) mPlugin).attach(mProxyComponent, mPluginPackage); + Bundle bundle = new Bundle(); + bundle.putInt(DLConstants.FROM, DLConstants.FROM_EXTERNAL); + // 调用插件的onCreate + callPluginOnCreate(bundle); + } + + /** + * 调用插件的onCreate方法 + * + * @param bundle 额外的数据 + */ + protected abstract void callPluginOnCreate(Bundle bundle); + +} diff --git a/DynamicLoadApk/lib/src/com/ryg/dynamicload/loader/DLServiceLoader.java b/DynamicLoadApk/lib/src/com/ryg/dynamicload/loader/DLServiceLoader.java new file mode 100644 index 0000000..12676ff --- /dev/null +++ b/DynamicLoadApk/lib/src/com/ryg/dynamicload/loader/DLServiceLoader.java @@ -0,0 +1,25 @@ + +package com.ryg.dynamicload.loader; + +import android.app.Service; +import android.os.Bundle; + +import com.ryg.dynamicload.internal.DLServicePlugin; + +/** + * 服务代理类 + * + * @author mrsimple + */ +public class DLServiceLoader extends DLBaseLoader { + + public DLServiceLoader(Service service) { + mProxyComponent = service; + } + + @Override + protected void callPluginOnCreate(Bundle dBundle) { + mPlugin.onCreate(); + } + +} diff --git a/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLProxyActivity.java b/DynamicLoadApk/lib/src/com/ryg/dynamicload/proxy/DLActivityProxy.java similarity index 90% rename from DynamicLoadApk/lib/src/com/ryg/dynamicload/DLProxyActivity.java rename to DynamicLoadApk/lib/src/com/ryg/dynamicload/proxy/DLActivityProxy.java index 92d8814..6dec201 100644 --- a/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLProxyActivity.java +++ b/DynamicLoadApk/lib/src/com/ryg/dynamicload/proxy/DLActivityProxy.java @@ -16,7 +16,7 @@ * limitations under the License. */ -package com.ryg.dynamicload; +package com.ryg.dynamicload.proxy; import android.app.Activity; import android.content.ComponentName; @@ -31,14 +31,17 @@ import android.view.MotionEvent; import android.view.WindowManager.LayoutParams; +import com.ryg.dynamicload.internal.DLActivityPlugin; import com.ryg.dynamicload.internal.DLAttachable; import com.ryg.dynamicload.internal.DLPluginManager; -import com.ryg.dynamicload.internal.DLProxyImpl; +import com.ryg.dynamicload.internal.DLPluginPackage; +import com.ryg.dynamicload.loader.DLActivityLoader; -public class DLProxyActivity extends Activity implements DLAttachable { +public class DLActivityProxy extends Activity + implements DLAttachable { - protected DLPlugin mRemoteActivity; - private DLProxyImpl impl = new DLProxyImpl(this); + protected DLActivityPlugin mRemoteActivity; + private DLActivityLoader impl = new DLActivityLoader(this); @Override protected void onCreate(Bundle savedInstanceState) { @@ -47,7 +50,7 @@ protected void onCreate(Bundle savedInstanceState) { } @Override - public void attach(DLPlugin remoteActivity, DLPluginManager pluginManager) { + public void attach(DLActivityPlugin remoteActivity, DLPluginPackage pluginPackage) { mRemoteActivity = remoteActivity; } @@ -172,7 +175,7 @@ public boolean onOptionsItemSelected(MenuItem item) { mRemoteActivity.onOptionsItemSelected(item); return super.onOptionsItemSelected(item); } - + @Override public ComponentName startService(Intent service) { return super.startService(service); diff --git a/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLProxyFragmentActivity.java b/DynamicLoadApk/lib/src/com/ryg/dynamicload/proxy/DLFragmentActivityProxy.java similarity index 89% rename from DynamicLoadApk/lib/src/com/ryg/dynamicload/DLProxyFragmentActivity.java rename to DynamicLoadApk/lib/src/com/ryg/dynamicload/proxy/DLFragmentActivityProxy.java index 1e77cf8..e3487fc 100644 --- a/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLProxyFragmentActivity.java +++ b/DynamicLoadApk/lib/src/com/ryg/dynamicload/proxy/DLFragmentActivityProxy.java @@ -16,7 +16,7 @@ * limitations under the License. */ -package com.ryg.dynamicload; +package com.ryg.dynamicload.proxy; import android.content.Intent; import android.content.res.AssetManager; @@ -30,14 +30,16 @@ import android.view.MotionEvent; import android.view.WindowManager.LayoutParams; +import com.ryg.dynamicload.internal.DLActivityPlugin; import com.ryg.dynamicload.internal.DLAttachable; -import com.ryg.dynamicload.internal.DLPluginManager; -import com.ryg.dynamicload.internal.DLProxyImpl; +import com.ryg.dynamicload.internal.DLPluginPackage; +import com.ryg.dynamicload.loader.DLActivityLoader; -public class DLProxyFragmentActivity extends FragmentActivity implements DLAttachable { +public class DLFragmentActivityProxy extends FragmentActivity + implements DLAttachable { - protected DLPlugin mRemoteActivity; - private DLProxyImpl impl = new DLProxyImpl(this); + protected DLActivityPlugin mRemoteActivity; + private DLActivityLoader impl = new DLActivityLoader(this); @Override protected void onCreate(Bundle savedInstanceState) { @@ -46,7 +48,7 @@ protected void onCreate(Bundle savedInstanceState) { } @Override - public void attach(DLPlugin remoteActivity, DLPluginManager pluginManager) { + public void attach(DLActivityPlugin remoteActivity, DLPluginPackage pluginPackage) { mRemoteActivity = remoteActivity; } diff --git a/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLProxyService.java b/DynamicLoadApk/lib/src/com/ryg/dynamicload/proxy/DLServiceProxy.java similarity index 60% rename from DynamicLoadApk/lib/src/com/ryg/dynamicload/DLProxyService.java rename to DynamicLoadApk/lib/src/com/ryg/dynamicload/proxy/DLServiceProxy.java index 186d4d8..60c13eb 100644 --- a/DynamicLoadApk/lib/src/com/ryg/dynamicload/DLProxyService.java +++ b/DynamicLoadApk/lib/src/com/ryg/dynamicload/proxy/DLServiceProxy.java @@ -1,8 +1,5 @@ -package com.ryg.dynamicload; -import com.ryg.dynamicload.internal.DLPluginManager; -import com.ryg.dynamicload.internal.DLServiceAttachable; -import com.ryg.dynamicload.internal.DLServiceProxyImpl; +package com.ryg.dynamicload.proxy; import android.annotation.TargetApi; import android.app.Service; @@ -12,114 +9,105 @@ import android.os.IBinder; import android.util.Log; -public class DLProxyService extends Service implements DLServiceAttachable{ - +import com.ryg.dynamicload.internal.DLAttachable; +import com.ryg.dynamicload.internal.DLPluginPackage; +import com.ryg.dynamicload.internal.DLServicePlugin; +import com.ryg.dynamicload.loader.DLServiceLoader; + +public class DLServiceProxy extends Service implements DLAttachable { + private static final String TAG = "DLProxyService"; - private DLServiceProxyImpl mImpl = new DLServiceProxyImpl(this); + private DLServiceLoader mImpl = new DLServiceLoader(this); private DLServicePlugin mRemoteService; - private DLPluginManager mPluginManager; - + @Override public IBinder onBind(Intent intent) { - // TODO Auto-generated method stub Log.d(TAG, TAG + " onBind"); - //判断是否存在插件Service,如果存在,则不进行Service插件的构造工作 + // 判断是否存在插件Service,如果存在,则不进行Service插件的构造工作 if (mRemoteService == null) { - mImpl.init(intent); + mImpl.onCreate(intent); } return mRemoteService.onBind(intent); } @Override public void onCreate() { - // TODO Auto-generated method stub super.onCreate(); Log.d(TAG, TAG + " onCreate"); - } - -// @Override -// public void onStart(Intent intent, int startId) { -// // TODO Auto-generated method stub -// super.onStart(intent, startId); -// Log.d(TAG, TAG + " onStart"); -// -// } - + } + + // @Override + // public void onStart(Intent intent, int startId) { + // // TODO Auto-generated method stub + // super.onStart(intent, startId); + // Log.d(TAG, TAG + " onStart"); + // + // } + @Override public int onStartCommand(Intent intent, int flags, int startId) { - // TODO Auto-generated method stub Log.d(TAG, TAG + " onStartCommand " + this.toString()); - //判断是否存在插件Service,如果存在,则不进行Service插件的构造工作 + // 判断是否存在插件Service,如果存在,则不进行Service插件的构造工作 if (mRemoteService == null) { - mImpl.init(intent); + mImpl.onCreate(intent); } super.onStartCommand(intent, flags, startId); return mRemoteService.onStartCommand(intent, flags, startId); -// return super.onStartCommand(intent, flags, startId); } - + @Override public void onDestroy() { - // TODO Auto-generated method stub mRemoteService.onDestroy(); super.onDestroy(); Log.d(TAG, TAG + " onDestroy"); } - + @Override public void onConfigurationChanged(Configuration newConfig) { - // TODO Auto-generated method stub mRemoteService.onConfigurationChanged(newConfig); super.onConfigurationChanged(newConfig); Log.d(TAG, TAG + " onConfigurationChanged"); } - + @Override public void onLowMemory() { - // TODO Auto-generated method stub mRemoteService.onLowMemory(); super.onLowMemory(); Log.d(TAG, TAG + " onLowMemory"); } - + @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) @Override public void onTrimMemory(int level) { - // TODO Auto-generated method stub mRemoteService.onTrimMemory(level); super.onTrimMemory(level); Log.d(TAG, TAG + " onTrimMemory"); } - + @Override public boolean onUnbind(Intent intent) { - // TODO Auto-generated method stub Log.d(TAG, TAG + " onUnbind"); super.onUnbind(intent); return mRemoteService.onUnbind(intent); } - + @Override public void onRebind(Intent intent) { - // TODO Auto-generated method stub mRemoteService.onRebind(intent); super.onRebind(intent); Log.d(TAG, TAG + " onRebind"); } - + @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) @Override public void onTaskRemoved(Intent rootIntent) { - // TODO Auto-generated method stub mRemoteService.onTaskRemoved(rootIntent); super.onTaskRemoved(rootIntent); Log.d(TAG, TAG + " onTaskRemoved"); } @Override - public void attach(DLServicePlugin remoteService, DLPluginManager pluginManager) { - // TODO Auto-generated method stub + public void attach(DLServicePlugin remoteService, DLPluginPackage pluginPackage) { mRemoteService = remoteService; - mPluginManager = pluginManager; } } diff --git a/DynamicLoadApk/lib/src/com/ryg/utils/LOG.java b/DynamicLoadApk/lib/src/com/ryg/utils/LOG.java index b961621..743392c 100644 --- a/DynamicLoadApk/lib/src/com/ryg/utils/LOG.java +++ b/DynamicLoadApk/lib/src/com/ryg/utils/LOG.java @@ -1,6 +1,5 @@ package com.ryg.utils; -import android.os.Debug; import android.util.Log; public class LOG { diff --git a/DynamicLoadApk/sample/main/main-host/AndroidManifest.xml b/DynamicLoadApk/sample/main/main-host/AndroidManifest.xml index 3339156..875fa4a 100644 --- a/DynamicLoadApk/sample/main/main-host/AndroidManifest.xml +++ b/DynamicLoadApk/sample/main/main-host/AndroidManifest.xml @@ -51,7 +51,7 @@ @@ -60,7 +60,7 @@ @@ -68,7 +68,7 @@ - +