package android.app; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.os.Binder; import android.os.Bundle; import android.text.TextUtils; import android.view.Window; import java.lang.reflect.InvocationTargetException; /** * 插件activity的代理 * * @author zhaoxuyang * */ public class PluginBlankActivity extends Activity { /** * 传进来插件activity的类名 */ public static final String ACTIVITY_NAME = "activityName"; /** * 对应的插件名称 */ public static final String PLUGIN_NAME = "pluginname"; /** * 插件的activity */ private Activity activity; @Override protected void onCreate(Bundle savedInstanceState) { // 根据intent信息,从插件中找到要载入的activity Intent intent = getIntent(); String activityName = intent.getStringExtra(ACTIVITY_NAME); String pluginName = intent.getStringExtra(PLUGIN_NAME); if (TextUtils.isEmpty(activityName) || TextUtils.isEmpty(pluginName)) { return; } PluginManagerImpl manager = PluginManagerImpl.getInstance(); Plugin plugin = manager.getPlugin(pluginName); ActivityInfo[] infos = plugin.mPluginInfo.mPackageInfo.activities; ActivityInfo info = null; int screenOriention = -1; for (int i = 0; i < infos.length; i++) { info = infos[i]; screenOriention = info.screenOrientation; if (info.name.equals(activityName)) { intent = new Intent(); intent.setComponent(new ComponentName(plugin.mPluginInfo.mPackageInfo.packageName, activityName)); intent.putExtras(getIntent()); // 参照activitygroup的代码,将activity启动起来 try { activity = (Activity) manager.startActivityNow.invoke(manager.mActivityThread, this, activityName, intent, info, new LocalBinder(), savedInstanceState, null); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } break; } } Window win = activity.getWindow(); getWindow().setAttributes(win.getAttributes()); requestWindowFeature(Window.FEATURE_NO_TITLE); setRequestedOrientation(screenOriention); super.onCreate(savedInstanceState); setContentView(win.getDecorView()); } @Override protected void onStart() { super.onStart(); activity.onStart(); } @Override protected void onRestart() { super.onRestart(); activity.onRestart(); } @Override protected void onResume() { super.onResume(); activity.onResume(); } @Override protected void onPause() { super.onPause(); activity.onPause(); } @Override protected void onStop() { super.onStop(); activity.onStop(); } @Override protected void onDestroy() { super.onDestroy(); activity.onDestroy(); } protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); activity.onSaveInstanceState(outState); } @Override void dispatchActivityResult(String who, int requestCode, int resultCode, Intent data) { activity.onActivityResult(requestCode, resultCode, data); super.dispatchActivityResult(who, requestCode, resultCode, data); } /* * 插件startactivity会调到这里,这里处理了隐式和显式启动activity (non-Javadoc) * * @see android.app.Activity#startActivityFromChild(android.app.Activity, * android.content.Intent, int) */ @Override public void startActivityFromChild(Activity child, Intent intent, int requestCode) { PluginManagerImpl.getInstance().startPluginActivity(intent); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); activity.onConfigurationChanged(newConfig); } /** * 占位用。。 * * @author zhaoxuyang * */ public static class LocalBinder extends Binder { } }