Skip to content

Commit 6960197

Browse files
committed
增加对插件Activity横竖屏配置、输入法mode配置的支持
1 parent 75ec49d commit 6960197

File tree

6 files changed

+47
-5
lines changed

6 files changed

+47
-5
lines changed

PluginCore/src/com/plugin/content/PluginActivityInfo.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,15 @@ public class PluginActivityInfo implements Serializable {
1717
private String screenOrientation;//string
1818
private String theme;//int
1919
private String immersive;//int string
20+
private String uiOptions;
21+
22+
public String getUiOptions() {
23+
return uiOptions;
24+
}
25+
26+
public void setUiOptions(String uiOptions) {
27+
this.uiOptions = uiOptions;
28+
}
2029

2130
public String getImmersive() {
2231
return immersive;

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

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import android.os.Handler;
1414
import android.view.ContextThemeWrapper;
1515
import android.view.LayoutInflater;
16+
import android.view.Window;
1617

1718
import com.plugin.content.PluginActivityInfo;
1819
import com.plugin.content.PluginDescriptor;
@@ -192,6 +193,14 @@ static void injectActivityContext(Activity activity) {
192193
((PluginContextTheme)pluginContext).mTheme = null;
193194
pluginContext.setTheme(pluginAppTheme);
194195

196+
//重设mContext
197+
RefInvoker.setFieldObject(activity.getWindow(), Window.class.getName(),
198+
"mContext", pluginContext);
199+
200+
//重设mWindowStyle
201+
RefInvoker.setFieldObject(activity.getWindow(), Window.class.getName(),
202+
"mWindowStyle", null);
203+
195204
// 重设LayoutInflater
196205
LogUtil.d(activity.getWindow().getClass().getName());
197206
RefInvoker.setFieldObject(activity.getWindow(), activity.getWindow().getClass().getName(),
@@ -204,10 +213,19 @@ static void injectActivityContext(Activity activity) {
204213
}
205214

206215
if (pluginActivityInfo != null) {
216+
217+
if (null != pluginActivityInfo.getWindowSoftInputMode()) {
218+
activity.getWindow().setSoftInputMode(Integer.parseInt(pluginActivityInfo.getWindowSoftInputMode().replace("0x", ""), 16));
219+
}
220+
if (Build.VERSION.SDK_INT >= 14) {
221+
if (null != pluginActivityInfo.getUiOptions()) {
222+
activity.getWindow().setUiOptions(Integer.parseInt(pluginActivityInfo.getUiOptions().replace("0x", ""), 16));
223+
}
224+
}
207225
if (null != pluginActivityInfo.getScreenOrientation()) {
208226
int orientation = Integer.parseInt(pluginActivityInfo.getScreenOrientation());
209227
//noinspection ResourceType
210-
//activity.setRequestedOrientation(orientation);
228+
activity.setRequestedOrientation(orientation);
211229
}
212230
if (Build.VERSION.SDK_INT >= 18) {
213231
Boolean isImmersive = ResourceUtil.getBoolean(pluginActivityInfo.getImmersive(), pluginContext);
@@ -220,7 +238,7 @@ static void injectActivityContext(Activity activity) {
220238
LogUtil.d(activity.getClass().getName(), "screenOrientation", pluginActivityInfo.getScreenOrientation());
221239
LogUtil.d(activity.getClass().getName(), "launchMode", pluginActivityInfo.getLaunchMode());
222240
LogUtil.d(activity.getClass().getName(), "windowSoftInputMode", pluginActivityInfo.getWindowSoftInputMode());
223-
241+
LogUtil.d(activity.getClass().getName(), "uiOptions", pluginActivityInfo.getUiOptions());
224242
}
225243

226244
//如果是独立插件,由于没有合并资源,这里还需要替换掉 mActivityInfo, 避免activity试图通过ActivityInfo中的资源id来读取资源时失败

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

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,23 +45,35 @@ public Activity newActivity(ClassLoader cl, String className, Intent intent) thr
4545
IllegalAccessException, ClassNotFoundException {
4646
// 将PluginStubActivity替换成插件中的activity
4747
if (className.equals(PluginStubActivity.class.getName())) {
48+
4849
String action = intent.getAction();
49-
if (action != null) {
50+
51+
//
52+
if (action != null && action.contains(PluginIntentResolver.ACTIVITY_ACTION_IN_PLUGIN)) {
5053

5154
String[] targetClassName = action.split(PluginIntentResolver.ACTIVITY_ACTION_IN_PLUGIN);
5255

5356
LogUtil.d(className, action, targetClassName[0]);
54-
Class clazz = PluginLoader.loadPluginClassByName(targetClassName[0]);
55-
cl = clazz.getClassLoader();
57+
5658
className = targetClassName[0];
59+
Class clazz = PluginLoader.loadPluginClassByName(className);
60+
cl = clazz.getClassLoader();
5761

5862
intent.setExtrasClassLoader(cl);
63+
intent.putExtra(PluginIntentResolver.ACTIVITY_ACTION_IN_PLUGIN, className);
5964
//由于之前intent被修改过 这里再吧Intent还原到原始的intent
6065
if (targetClassName.length >1) {
6166
intent.setAction(targetClassName[1]);
6267
} else {
6368
intent.setAction(null);
6469
}
70+
71+
} else {
72+
//进入这个分支可能是activity重启了,比如横竖屏切换
73+
className = intent.getStringExtra(PluginIntentResolver.ACTIVITY_ACTION_IN_PLUGIN);
74+
Class clazz = PluginLoader.loadPluginClassByName(className);
75+
76+
cl = clazz.getClassLoader();
6577
}
6678
}
6779

PluginCore/src/com/plugin/util/ManifestParser.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ public static PluginDescriptor parseManifest(String pluginPath) {
115115
String screenOrientation = parser.getAttributeValue(namespaceAndroid, "screenOrientation");//string
116116
String theme = parser.getAttributeValue(namespaceAndroid, "theme");//int
117117
String immersive = parser.getAttributeValue(namespaceAndroid, "immersive");//int string
118+
String uiOptions = parser.getAttributeValue(namespaceAndroid, "uiOptions");//int string
118119

119120
HashMap<String, ArrayList<PluginIntentFilter>> map = desciptor.getActivitys();
120121
if (map == null) {
@@ -141,6 +142,7 @@ public static PluginDescriptor parseManifest(String pluginPath) {
141142
pluginActivityInfo.setScreenOrientation(screenOrientation);
142143
pluginActivityInfo.setTheme(theme);
143144
pluginActivityInfo.setWindowSoftInputMode(windowSoftInputMode);
145+
pluginActivityInfo.setUiOptions(uiOptions);
144146

145147
} else if ("receiver".equals(parser.getName())) {
146148

12 Bytes
Binary file not shown.

PluginTest/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
android:launchMode="singleTop"
5151
android:immersive="true"
5252
android:screenOrientation="landscape"
53+
android:uiOptions="splitActionBarWhenNarrow"
5354
android:theme="@style/PluginTheme">
5455
<intent-filter>
5556
<action

0 commit comments

Comments
 (0)