Skip to content

Commit eb02038

Browse files
committed
插件Activity关闭后回收LaunchMode映射关系。
1 parent 7a194d9 commit eb02038

File tree

4 files changed

+66
-3
lines changed

4 files changed

+66
-3
lines changed

PluginCore/src/com/plugin/core/PluginInjector.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,10 @@ static void injectActivityContext(Activity activity) {
223223
if (null != pluginActivityInfo.getScreenOrientation()) {
224224
int orientation = Integer.parseInt(pluginActivityInfo.getScreenOrientation());
225225
//noinspection ResourceType
226-
activity.setRequestedOrientation(orientation);
226+
if (orientation != activityInfo.screenOrientation) {
227+
//noinspection ResourceType
228+
activity.setRequestedOrientation(orientation);
229+
}
227230
}
228231
if (Build.VERSION.SDK_INT >= 18) {
229232
Boolean isImmersive = ResourceUtil.getBoolean(pluginActivityInfo.getImmersive(), pluginContext);

PluginCore/src/com/plugin/core/PluginIntentResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public class PluginIntentResolver {
9999

100100
PluginActivityInfo pluginActivityInfo = pd.getActivityInfos().get(className);
101101

102-
String stubActivityName = PluginStubBinding.getLaunchModeStubActivity(className, Integer.parseInt(pluginActivityInfo.getLaunchMode()));
102+
String stubActivityName = PluginStubBinding.bindLaunchModeStubActivity(className, Integer.parseInt(pluginActivityInfo.getLaunchMode()));
103103

104104
intent.setComponent(
105105
new ComponentName(PluginLoader.getApplicatoin().getPackageName(), stubActivityName));

PluginCore/src/com/plugin/core/PluginLoader.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,19 @@
88
import java.util.Map.Entry;
99
import java.util.Set;
1010

11+
import android.app.Activity;
1112
import android.app.Application;
1213
import android.app.Instrumentation;
14+
import android.content.ComponentName;
1315
import android.content.Context;
1416
import android.content.Intent;
1517
import android.content.pm.ApplicationInfo;
1618
import android.content.pm.PackageInfo;
1719
import android.content.pm.PackageManager;
1820
import android.content.pm.Signature;
1921
import android.content.res.Resources;
22+
import android.os.Build;
23+
import android.os.Bundle;
2024
import android.text.TextUtils;
2125

2226
import com.plugin.content.PluginDescriptor;
@@ -84,6 +88,39 @@ public static synchronized void initLoader(Application app, PluginManager manage
8488
pluginManager.loadInstalledPlugins();
8589
changeListener.onPluginLoaderInited();
8690

91+
if (Build.VERSION.SDK_INT >= 14) {
92+
93+
sApplication.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
94+
@Override
95+
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
96+
}
97+
98+
@Override
99+
public void onActivityStarted(Activity activity) {
100+
}
101+
102+
@Override
103+
public void onActivityResumed(Activity activity) {
104+
}
105+
106+
@Override
107+
public void onActivityPaused(Activity activity) {
108+
}
109+
110+
@Override
111+
public void onActivityStopped(Activity activity) {
112+
}
113+
114+
@Override
115+
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
116+
}
117+
118+
@Override
119+
public void onActivityDestroyed(Activity activity) {
120+
PluginStubBinding.unBindLaunchModeStubActivity(activity.getClass().getName(), activity.getIntent());
121+
}
122+
});
123+
}
87124
LogUtil.d("插件框架初始化完成");
88125
}
89126
}

PluginCore/src/com/plugin/core/PluginStubBinding.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.plugin.core;
22

3+
import android.content.ComponentName;
34
import android.content.Intent;
45
import android.content.pm.ActivityInfo;
56
import android.content.pm.PackageManager;
@@ -21,13 +22,17 @@ public class PluginStubBinding {
2122

2223
private static final String ACTION_LAUNCH_MODE = "com.plugin.core.LAUNCH_MODE";
2324

25+
/**
26+
* key:stub Activity Name
27+
* value:plugin Activity Name
28+
*/
2429
private static HashMap<String, String> singleTaskMapping = new HashMap<String, String>();
2530
private static HashMap<String, String> singleTopMapping = new HashMap<String, String>();
2631
private static HashMap<String, String> singleInstanceMapping = new HashMap<String, String>();
2732

2833
private static boolean isPoolInited = false;
2934

30-
public static String getLaunchModeStubActivity(String pluginActivityClassName, int launchMode) {
35+
public static String bindLaunchModeStubActivity(String pluginActivityClassName, int launchMode) {
3136

3237
initPool();
3338

@@ -108,4 +113,22 @@ private static void initPool() {
108113

109114
isPoolInited = true;
110115
}
116+
117+
public static void unBindLaunchModeStubActivity(String activityName, Intent intent) {
118+
if (activityName.startsWith(PluginStubBinding.STUB_ACTIVITY_PRE)) {
119+
if (intent != null) {
120+
ComponentName cn = intent.getComponent();
121+
if (cn != null) {
122+
String pluginActivityName = cn.getClassName();
123+
if (pluginActivityName.equals(singleTaskMapping.get(activityName))) {
124+
singleTaskMapping.put(activityName, null);
125+
} else if (pluginActivityName.equals(singleInstanceMapping.get(activityName))) {
126+
singleInstanceMapping.put(activityName, null);
127+
} else {
128+
//对于standard和singleTop的launchmode,不做处理。
129+
}
130+
}
131+
}
132+
}
133+
}
111134
}

0 commit comments

Comments
 (0)