Android-插件化三插樁實(shí)現(xiàn)廣播的加載

本篇是在實(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));
            }
        });
    }
}

為了簡(jiǎn)化,直接在插件的主頁面做了廣播的注冊(cè),并通過點(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ā)送廣播和注冊(cè)廣播重寫的部分代碼邏輯,只是做了一個(gè)轉(zhuǎn)發(fā)

測(cè)試能夠完美運(yùn)行……

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容