本篇是在實(shí)現(xiàn)Activity的基礎(chǔ)上做的轧简,插件apk的加載這塊沒有變化啦辐,所以本篇之介紹關(guān)于Broadcast加載的內(nèi)容
1.宿主app
public class ProxyBroadCast extends BroadcastReceiver {
private String mClassName;
private MSInterfaceBroadcast msInterfaceBroadcast;
public ProxyBroadCast(String className,Context context) {
this.mClassName = className;
try {
Class<?> aClass = PluginLoadManager.getInstance().getDexClassLoader().loadClass(mClassName); //記載插件廣播類文件
Constructor<?> constructor = aClass.getConstructor(new Class[]{}); //得到構(gòu)造函數(shù)
Object o = constructor.newInstance(); //實(shí)例化函數(shù)
if (o instanceof MSInterfaceBroadcast){
msInterfaceBroadcast= (MSInterfaceBroadcast) o;
msInterfaceBroadcast.attach(context);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onReceive(Context context, Intent intent) {
msInterfaceBroadcast.onReceive(context,intent); //轉(zhuǎn)發(fā)到插件廣播接收者
}
}
這部分是廣播的插樁部分的實(shí)現(xiàn),主要包含兩部分功能:
- 1.加載插件廣播類并實(shí)例化换衬,注入上下文
- 2.接收到廣播轉(zhuǎn)發(fā)到插件廣播中去
2.廣播接口標(biāo)準(zhǔn)
public interface MSInterfaceBroadcast {
public void attach(Context context);
public void onReceive(Context context, Intent intent);
}
這部分是根據(jù)BroadcastReceiver來定義的炸卑,可以根據(jù)需求進(jìn)行增減
3.廣播插件部分的實(shí)現(xiàn)
public class PluginReceiver extends BroadcastReceiver implements MSInterfaceBroadcast {
@Override
public void attach(Context context) {
Toast.makeText(context, "attach success", Toast.LENGTH_SHORT).show();
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "插件收到廣播", Toast.LENGTH_SHORT).show();
}
}
插件部分定義好接收者,并彈出了Toast
public class MainActivity extends BaseActivity {
static final String ACTION = "com.meishe.PLUGIN_ACTION";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View viewById = findViewById(R.id.image);
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction(ACTION);
registerReceiver(new PluginReceiver(),intentFilter);
viewById.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(that,"發(fā)送廣播",Toast.LENGTH_SHORT).show();
startService(new Intent(that,PluginService.class));
sendBroadcast(new Intent(ACTION));
}
});
}
}
為了簡化录豺,直接在插件的主頁面做了廣播的注冊朦肘,并通過點(diǎn)擊事件發(fā)送廣播
注意:sendBroadcast,registerReceiver 這兩個(gè)方法不能調(diào)用系統(tǒng)方法双饥,需要重寫
class BaseActivity extends AppCompatActivity implements MSInterfaceActivity {
protected Activity that;
@Override
public void attach(Activity proxyActivity) {
that =proxyActivity;
}
...
@Override
public void sendBroadcast(Intent intent) {
that.sendBroadcast(intent);
}
@Override
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
return that.registerReceiver(receiver, filter);
}
...
}
這是發(fā)送廣播和注冊廣播重寫的部分代碼邏輯媒抠,只是做了一個(gè)轉(zhuǎn)發(fā)
測試能夠完美運(yùn)行……