Skip to content

Commit df68149

Browse files
committed
修复多Receiver时只有第一个会响应的问题
1 parent b987fbf commit df68149

File tree

3 files changed

+122
-107
lines changed

3 files changed

+122
-107
lines changed

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

Lines changed: 54 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030

3131
import com.plugin.util.LogUtil;
3232

33+
import java.util.ArrayList;
34+
3335
public class PluginBaseContextWrapper extends ContextWrapper {
3436

3537
public PluginBaseContextWrapper(Context base) {
@@ -57,48 +59,59 @@ public void startActivity(Intent intent, Bundle options) {
5759
@Override
5860
public void sendBroadcast(Intent intent) {
5961
LogUtil.d(intent);
60-
intent = PluginIntentResolver.resolveReceiver(intent);
61-
super.sendBroadcast(intent);
62+
ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent);
63+
for (Intent item:list) {
64+
super.sendBroadcast(item);
65+
}
6266
}
6367

6468
@Override
6569
public void sendBroadcast(Intent intent, String receiverPermission) {
6670
LogUtil.d(intent);
67-
intent = PluginIntentResolver.resolveReceiver(intent);
68-
super.sendBroadcast(intent, receiverPermission);
71+
ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent);
72+
for (Intent item:list) {
73+
super.sendBroadcast(item, receiverPermission);
74+
}
6975
}
7076

7177
@Override
7278
public void sendOrderedBroadcast(Intent intent, String receiverPermission) {
7379
LogUtil.d(intent);
74-
intent = PluginIntentResolver.resolveReceiver(intent);
75-
super.sendOrderedBroadcast(intent, receiverPermission);
80+
ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent);
81+
for (Intent item:list) {
82+
super.sendOrderedBroadcast(item, receiverPermission);
83+
}
7684
}
7785

7886
@Override
7987
public void sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver,
8088
Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
8189
LogUtil.d(intent);
82-
intent = PluginIntentResolver.resolveReceiver(intent);
83-
super.sendOrderedBroadcast(intent, receiverPermission, resultReceiver,
84-
scheduler, initialCode, initialData, initialExtras);
85-
90+
ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent);
91+
for (Intent item:list) {
92+
super.sendOrderedBroadcast(item, receiverPermission, resultReceiver,
93+
scheduler, initialCode, initialData, initialExtras);
94+
}
8695
}
8796

8897
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
8998
@Override
9099
public void sendBroadcastAsUser(Intent intent, UserHandle user) {
91100
LogUtil.d(intent);
92-
intent = PluginIntentResolver.resolveReceiver(intent);
93-
super.sendBroadcastAsUser(intent, user);
101+
ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent);
102+
for (Intent item:list) {
103+
super.sendBroadcastAsUser(item, user);
104+
}
94105
}
95106

96107
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
97108
@Override
98109
public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission) {
99110
LogUtil.d(intent);
100-
intent = PluginIntentResolver.resolveReceiver(intent);
101-
super.sendBroadcastAsUser(intent, user, receiverPermission);
111+
ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent);
112+
for (Intent item:list) {
113+
super.sendBroadcastAsUser(item, user, receiverPermission);
114+
}
102115
}
103116

104117
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
@@ -107,49 +120,62 @@ public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String re
107120
BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData,
108121
Bundle initialExtras) {
109122
LogUtil.d(intent);
110-
intent = PluginIntentResolver.resolveReceiver(intent);
111-
super.sendOrderedBroadcastAsUser(intent, user, receiverPermission, resultReceiver, scheduler, initialCode,
112-
initialData, initialExtras);
123+
ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent);
124+
for (Intent item:list) {
125+
super.sendOrderedBroadcastAsUser(item, user, receiverPermission, resultReceiver, scheduler, initialCode,
126+
initialData, initialExtras);
127+
}
113128
}
114129

115130
@Override
116131
public void sendStickyBroadcast(Intent intent) {
117132
LogUtil.d(intent);
118-
intent = PluginIntentResolver.resolveReceiver(intent);
119-
super.sendStickyBroadcast(intent);
133+
ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent);
134+
for (Intent item:list) {
135+
super.sendStickyBroadcast(item);
136+
}
120137
}
121138

122139
@Override
123140
public void sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, Handler scheduler,
124141
int initialCode, String initialData, Bundle initialExtras) {
125142
LogUtil.d(intent);
126-
intent = PluginIntentResolver.resolveReceiver(intent);
127-
super.sendStickyOrderedBroadcast(intent, resultReceiver, scheduler, initialCode, initialData, initialExtras);
143+
ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent);
144+
for (Intent item:list) {
145+
super.sendStickyOrderedBroadcast(item, resultReceiver, scheduler, initialCode, initialData, initialExtras);
146+
}
147+
128148
}
129149

130150
@Override
131151
public void removeStickyBroadcast(Intent intent) {
132152
LogUtil.d(intent);
133-
intent = PluginIntentResolver.resolveReceiver(intent);
134-
super.removeStickyBroadcast(intent);
153+
ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent);
154+
for (Intent item:list) {
155+
super.removeStickyBroadcast(item);
156+
}
135157
}
136158

137159
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
138160
@Override
139161
public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) {
140162
LogUtil.d(intent);
141-
intent = PluginIntentResolver.resolveReceiver(intent);
142-
super.sendStickyBroadcastAsUser(intent, user);
163+
ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent);
164+
for (Intent item:list) {
165+
super.sendStickyBroadcastAsUser(item, user);
166+
}
143167
}
144168

145169
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
146170
@Override
147171
public void sendStickyOrderedBroadcastAsUser(Intent intent, UserHandle user, BroadcastReceiver resultReceiver,
148172
Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
149173
LogUtil.d(intent);
150-
intent = PluginIntentResolver.resolveReceiver(intent);
151-
super.sendStickyOrderedBroadcastAsUser(intent, user, resultReceiver, scheduler, initialCode, initialData,
152-
initialExtras);
174+
ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent);
175+
for (Intent item:list) {
176+
super.sendStickyOrderedBroadcastAsUser(item, user, resultReceiver, scheduler, initialCode, initialData,
177+
initialExtras);
178+
}
153179
}
154180

155181
@Override

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

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import com.plugin.util.LogUtil;
1515
import com.plugin.util.RefInvoker;
1616

17+
import java.util.ArrayList;
18+
1719
public class PluginIntentResolver {
1820

1921
static final String ACTIVITY_ACTION_IN_PLUGIN = "_ACTIVITY_ACTION_IN_PLUGIN_";
@@ -23,28 +25,36 @@ public class PluginIntentResolver {
2325
private static String RECEIVER_ACTION_IN_PLUGIN = "_RECEIVER_ACTION_IN_PLUGIN_";
2426

2527
/* package */static void resolveService(Intent service) {
26-
String className = PluginLoader.matchPlugin(service);
27-
if (className != null) {
28+
ArrayList<String> classNameList = PluginLoader.matchPlugin(service, PluginDescriptor.SERVICE);
29+
if (classNameList != null && classNameList.size() > 0) {
2830
ClassLoaderUtil.hackHostClassLoaderIfNeeded();
29-
String stubActivityName = PluginStubBinding.bindStubService(className);
31+
String stubActivityName = PluginStubBinding.bindStubService(classNameList.get(0));
3032
if (stubActivityName != null) {
3133
service.setClassName(PluginLoader.getApplicatoin(), stubActivityName);
3234
}
3335
}
3436
}
3537

36-
/* package */static Intent resolveReceiver(final Intent intent) {
38+
/* package */static ArrayList<Intent> resolveReceiver(final Intent intent) {
3739
// 如果在插件中发现了匹配intent的receiver项目,替换掉ClassLoader
3840
// 不需要在这里记录目标className,className将在Intent中传递
39-
String className = PluginLoader.matchPlugin(intent);
40-
if (className != null) {
41+
ArrayList<Intent> result = new ArrayList<Intent>();
42+
ArrayList<String> classNameList = PluginLoader.matchPlugin(intent, PluginDescriptor.BROADCAST);
43+
if (classNameList != null) {
4144
ClassLoaderUtil.hackHostClassLoaderIfNeeded();
42-
intent.setComponent(new ComponentName(PluginLoader.getApplicatoin().getPackageName(),
43-
PluginStubReceiver.class.getName()));
44-
//hackReceiverForClassLoader检测到这个标记后会进行替换
45-
intent.setAction(className + RECEIVER_ACTION_IN_PLUGIN + (intent.getAction() == null ? "" : intent.getAction()));
45+
46+
for(String className: classNameList) {
47+
Intent newIntent = new Intent(intent);
48+
newIntent.setComponent(new ComponentName(PluginLoader.getApplicatoin().getPackageName(),
49+
PluginStubReceiver.class.getName()));
50+
//hackReceiverForClassLoader检测到这个标记后会进行替换
51+
newIntent.setAction(className + RECEIVER_ACTION_IN_PLUGIN + (intent.getAction() == null ? "" : intent.getAction()));
52+
result.add(newIntent);
53+
}
54+
} else {
55+
result.add(intent);
4656
}
47-
return intent;
57+
return result;
4858
}
4959

5060
/* package */static Class hackReceiverForClassLoader(Object msgObj) {
@@ -99,9 +109,10 @@ public class PluginIntentResolver {
99109

100110
/* package */static void resolveActivity(Intent intent) {
101111
// 如果在插件中发现Intent的匹配项,记下匹配的插件Activity的ClassName
102-
String className = PluginLoader.matchPlugin(intent);
103-
if (className != null) {
112+
ArrayList<String> classNameList = PluginLoader.matchPlugin(intent, PluginDescriptor.ACTIVITY);
113+
if (classNameList != null && classNameList.size() >0) {
104114

115+
String className = classNameList.get(0);
105116
PluginDescriptor pd = PluginLoader.getPluginDescriptorByClassName(className);
106117

107118
PluginActivityInfo pluginActivityInfo = pd.getActivityInfos().get(className);
@@ -124,14 +135,11 @@ public class PluginIntentResolver {
124135
* @param intent
125136
* @return
126137
*/
127-
public static Intent resolveNotificationIntent(Intent intent) {
128-
int type = PluginLoader.getTargetType(intent);
129-
130-
LogUtil.d("notification type", type);
138+
public static Intent resolveNotificationIntent(Intent intent, int type) {
131139

132140
if (type == PluginDescriptor.BROADCAST) {
133141

134-
Intent newIntent = PluginIntentResolver.resolveReceiver(intent);
142+
Intent newIntent = PluginIntentResolver.resolveReceiver(intent).get(0);
135143
return newIntent;
136144

137145
} else if (type == PluginDescriptor.ACTIVITY) {
@@ -149,24 +157,22 @@ public static Intent resolveNotificationIntent(Intent intent) {
149157
}
150158

151159
@SuppressWarnings("ResourceType")
152-
public static PendingIntent resolvePendingIntent(PendingIntent origin) {
160+
public static PendingIntent resolvePendingIntent(PendingIntent origin, int type) {
153161
if (origin != null) {
154162
Intent originIntent = (Intent)RefInvoker.invokeMethod(origin,
155163
PendingIntent.class.getName(), "getIntent",
156164
(Class[])null, (Object[])null);
157165
if (originIntent != null) {
158166
//如果目标是插件中的组件,需要额外提供2个参数, 默认为0、Update_Current。
159-
String className = PluginLoader.matchPlugin(originIntent);
160-
if (className != null) {
161-
162-
int type = PluginLoader.getTargetType(originIntent);
167+
ArrayList<String> classNameList = PluginLoader.matchPlugin(originIntent, type);
168+
if (classNameList != null && classNameList.size() > 0) {
163169

164170
int requestCode = originIntent.getIntExtra("pending_requestCode", 0);
165171
int flags = originIntent.getIntExtra("pending_flag", PendingIntent.FLAG_UPDATE_CURRENT);
166172

167173
if (type == PluginDescriptor.BROADCAST) {
168174

169-
Intent newIntent = PluginIntentResolver.resolveReceiver(originIntent);
175+
Intent newIntent = PluginIntentResolver.resolveReceiver(originIntent).get(0);
170176
return PendingIntent.getBroadcast(PluginLoader.getApplicatoin(), requestCode, newIntent, flags);
171177

172178
} else if (type == PluginDescriptor.ACTIVITY) {

0 commit comments

Comments
 (0)