1. 程式人生 > >安卓 廣播在baseActivity中的封裝

安卓 廣播在baseActivity中的封裝

之前專案使用的是 廣播來通知訊息 的  程式碼大家都知道

這是一個簡單的傳送廣播的程式碼片段
Intent intent = new Intent("net.jxx.action");
        intent.putExtra(“type”, type);
  sendBroadcast(intent);




這是一個簡單的接受廣播的的程式碼片段
IntentFilter intentFilter = new IntentFilter(
                "net.jxx.action");
     BroadcastReceiver   broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                int type = intent.getIntExtra(“type”, -1);
                
            }
        };

registerReceiver(broadcastReceiver, intentFilter);
unregisterReceiver(broadcastReceiver, intentFilter);

可是每一次都得寫這麼多的程式碼 。程式碼量比較大。後來使用enevtbus  需要許多的javabean物件。後樓梯不勝其煩.這次在封裝自己使用的mvp+retrofit+Rxjava+baseActivity(點選這裡)在考慮廣播的使用的時候,決定封裝到baseActivity。為什麼封裝到baseActivity。baseActivity中有activity的生命週期。可以直接註冊,登出。

但是問題出現了。比如說1個類 我需要好幾引數,怎麼辦?我使用的是可變引數。解決不管是幾個引數都需要註冊的問題。那麼這樣的話 在子activity  就可以實現一句話傳送廣播和接受廣播的問題。

同時為了具體區不同的狀況 。決定使用  介面來繫結區分收到的不同引數


    /**
     傳送的時候    只需要sendMyBroadcast(int  type)
     */
    public void sendMyBroadcast(int  type) {
        sendBroadcast(Constant.createIntent(
                type));

    }




    /**
     接受的時候    initReceiver
     */
    public void initReceiver(final BroadcastInterface myinterface, final int...  statue) {
        intentFilter = new IntentFilter(
                Constant.ACTION);
        broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                int type = intent.getIntExtra(Constant.BROADCAST_KEY_type, Constant.TYPE_NONE);
                if (type== Constant.TYPE_NONE){
                    myinterface.receiverFailure();
                }else {
                    myinterface.receiverSuccess( intent,type);
                }
            }
        };

        getApplicationContext().registerReceiver(broadcastReceiver, intentFilter);
    }

這是常量類的引數

public class Constant {


    public static Intent createIntent(int type) {
        Intent intent = new Intent(ACTION);
        intent.putExtra(BROADCAST_KEY_type, type);
        return intent;
    }

    public static final String ACTION = "net.jxx.action";
    public static final String BROADCAST_KEY_type = "type";
    public static final int TYPE_NONE = -1;
}
這是繫結介面具體方法
public interface BroadcastInterface {
     void receiverSuccess(Intent intent, int statue);
     void receiverFailure();

}

子antivity中使用:

傳送的時候
 sendMyBroadcast(1001);

子antivity中接受使用:

initReceiver(this,1001,1000);

同時注意  接受的activity實現介面 BroadcastInterface的方法

這樣就可以在介面中進行判斷了

 @Override
    public void receiverSuccess(Intent intent, int statue) {
        Log.e("jxx",statue+">>");
        Toast.makeText(MainActivity.this,statue+"   ",Toast.LENGTH_SHORT).show();
        content.setText("  "+statue);
    }

    @Override
    public void receiverFailure() {

    }
}

注意:廣播的註冊也需要unregisterReceiver