如果沒有看過占位式插件化框架—Activity通信的請(qǐng)先看這篇文章旋讹,因?yàn)檫@篇文章是在它的實(shí)例的基礎(chǔ)上寫的。
思考:插件p.apk中的PluginActivity怎么動(dòng)態(tài)注冊(cè)廣播和發(fā)送廣播锐膜?
如果看占位式插件化框架—Activity通信和占位式插件化框架—Service通信這兩篇文章,實(shí)現(xiàn)這個(gè)是很簡(jiǎn)單的弛房。
public interface ReceiverInterface {
void onReceive(Context context, Intent intent);
}
public class MyReceiver extends BroadcastReceiver implements ReceiverInterface {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "我是插件里面的廣播接收者道盏,我收到了廣播", Toast.LENGTH_LONG).show();
Log.e("migill", "MyReceiver onReceive 接收到廣播 ");
}
}
public class BaseActivity extends Activity implements ActivityInterface {
.......
@Override
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
Log.e("migill", "BaseActivity registerReceiver receiver : " + receiver.getClass().getName());
return appActivity.registerReceiver(receiver, filter);
}
@Override
public void sendBroadcast(Intent intent) {
Log.e("migill", "BaseActivity sendBroadcast action :" + intent.getAction());
appActivity.sendBroadcast(intent);
}
}
}
在BaseActivity中增加注冊(cè)廣播和發(fā)送廣播的方法。registerReceiver()和sendBroadcast()兩個(gè)方法都是調(diào)用宿主中的方法。
public class PluginActivity extends BaseActivity {
private final String ACTION = "com.migill.plugin_package.ACTION";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_plugin);//執(zhí)行的是BaseActivity中的setContentView方法
Log.e("migill", "我是插件PluginActivity");
.......
findViewById(R.id.bt_register_receiver).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ACTION);
registerReceiver(new MyReceiver(), intentFilter);
}
});
findViewById(R.id.bt_send_receiver).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(ACTION);
sendBroadcast(intent);
}
});
}
}
點(diǎn)擊注冊(cè)廣播的按鈕荷逞,調(diào)用的是BaseActivity中的registerReceiver()媒咳。
點(diǎn)擊發(fā)送廣播的按鈕,調(diào)用的是BaseActivity中的sendBroadcast()种远。
編譯apk,重命名為p.apk,并放入 /storage/emulated/0/Android/data/com.migill.pluginproject/files/這個(gè)目錄下涩澡。
public class ProxyActivity extends Activity {
......
@Override
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
String pluginMyReceiverClassName = receiver.getClass().getName();
Log.e("migill", "ProxyActivity registerReceiver pluginMyReceiverClassName : " + pluginMyReceiverClassName);
return super.registerReceiver(new ProxyReceiver(pluginMyReceiverClassName), filter);
}
@Override
public void sendBroadcast(Intent intent) {
Log.e("migill", "ProxyActivity sendBroadcast action : " + intent.getAction());
super.sendBroadcast(intent);
}
}
這兩個(gè)方法都是動(dòng)態(tài)注冊(cè)廣播和發(fā)送廣播的方法。實(shí)際上這里注冊(cè)的是代理的廣播接收者ProxyReceiver坠敷。
public class ProxyReceiver extends BroadcastReceiver {
private String pluginMyReceiverClassName;
public ProxyReceiver(String pluginMyReceiverClassName) {
this.pluginMyReceiverClassName = pluginMyReceiverClassName;
}
@Override
public void onReceive(Context context, Intent intent) {
Log.e("migill", "ProxyReceiver onReceive 接收到了廣播");
//加載插件里面的MyReceiver
try {
Class mMyRecevierClass = PluginManager.getInstance(context).getClassLoader().loadClass(pluginMyReceiverClassName);
Object mMyReceiver = mMyRecevierClass.newInstance();
ReceiverInterface receiverInterface = (ReceiverInterface) mMyReceiver;
receiverInterface.onReceive(context, intent);
} catch (Exception e) {
e.printStackTrace();
}
}
}
接收到廣播的時(shí)候會(huì)走onReceive()方法妙同,它就會(huì)根據(jù)全類名實(shí)例化對(duì)象,并調(diào)用receiverInterface.onReceive()膝迎。