1. 程式人生 > >用觀察者模式,傳遞廣播中收的值

用觀察者模式,傳遞廣播中收的值

前言:
最近專案中有用到廣播,需要接收到廣播傳過來的值,在指定頁面上使用是不是很簡單呢,沒錯,這時候有人說可以寫區域性廣播啊,哪個頁面需要用到哪個頁面寫廣播啊,沒錯這的確是一個方法,但是如果說有五個頁面你能五個都寫麼。這時候又會有人說,那就用全域性啊,對 小白就是用的全域性。那麼我們如何將接受的值在指定頁面時使用。其實方法很多(比如介面回撥,eventbus等等),小白 用的是觀察者模式,話不多說看下面:

    1:說白觀察者模式,也就是一些介面來回調。但是我們使用肯定是離不開重要的兩個類的 Subject 和Ovserver  我們可以把廣播當做一個被觀察者。看一下實現

   首先 我們寫一個 Subject介面


public interface Subjectinter {


    /*
        註冊觀察者
     */
      public void  addObserver(Observerinter observer);

     /*
        移除觀察者
      */
       public  void removeObserver(Observerinter observer);
      /*
         傳遞數值
       */
      public  void getobserver(String count);
}

2:其次是Obsever 介面


public interface Observerinter {


        public void updatestate(String count);
}

3:在Adnroid裡,最適合實現Subject 類的莫過於Applicationl了,因為它是全域性唯一而且生命週期就是這個App的生命週期



import android.app.Application;
import android.content.Context;

import com.jitv.railway.interfine.Observerinter;
import com.jitv.railway.interfine.Subjectinter;
import
com.jtv.android.common.CommTool; import com.jtv.android.data.CommDataAdapter; import com.jtv.push.PushConfig; import java.util.ArrayList; import java.util.List; /** * Created by ASUS on 2018/4/24. */ public class Mybaseapplication extends Application implements Subjectinter { public static Mybaseapplication application; private List<Observerinter> mObserverinters = new ArrayList<>(); @Override public void onCreate() { super.onCreate(); indata(); application = this; } @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); } public static Mybaseapplication getApplication() { if (application == null) { application = getApplication(); } return application; } /* 將觀察者新增到集合 */ @Override public void addObserver(Observerinter observer) { if (!mObserverinters.contains(observer)) { mObserverinters.add(observer); } } /* 移除觀察者 */ @Override public void removeObserver(Observerinter observer) { if (mObserverinters != null && mObserverinters.contains(observer)) { mObserverinters.remove(observer); } } /* 擷取廣播中收到的值 將值傳給觀察者 */ @Override public void getobserver(String count) { if (mObserverinters != null && mObserverinters.size() > 0) { for (Observerinter mobserver : mObserverinters) { mobserver.updatestate(count); } } } }

廣播裡面我們只需要調取傳值的介面


        import android.content.BroadcastReceiver;
        import android.content.Context;
        import android.content.Intent;
        import com.jitv.railway.Mybaseapplication;



/**
 * Created by ASUS on 2018/6/12.
 */

public class Broadcastbroadreceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String scanResult_1 = intent.getStringExtra("SCAN_BARCODE1");
        final String scanResult_2 = intent.getStringExtra("SCAN_BARCODE2");
        final int barcodeType = intent.getIntExtra("SCAN_BARCODE_TYPE", -1); // -1:unknown
        final String scanStatus = intent.getStringExtra("SCAN_STATE");

        if ("ok".equals(scanStatus)) {
            Log.d("TAG", "掃秒到的東西" + scanResult_1);

               /*
                  將廣播當做被觀察者,將資料傳遞到觀察者
                */
               if(Mybaseapplication.getApplication()!=null){
                   Mybaseapplication.getApplication().getobserver(scanResult_1);
               }
        }
    }



}

最後我們要在那個activity 呼叫就去實現這個介面就行

package sceneactivity;

import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;

/**
 * Created by ASUS on 2018/4/25.
 */

public class TemporaryActivity extends BaseListActivity implements Observerinter {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setMidTitle("故障列表");
         //建立觀察者
        Mybaseapplication.getApplication().addObserver(this);
        }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //移除觀察者
         Mybaseapplication.getApplication().removeObserver(this);
    }

    @Override
    public void updatestate(String count) {
           //收到值
           Log.d("TAG","收到傳過來的值"+count);
        Intent intents = new Intent(TemporaryActivity.this, AddtemproActivity.class);
        intents.putExtra("code",count);
        startActivityForResult(intents,100);
    }
}

搞定 是不是很簡單呢!!