用观察者模式,传递广播中收的值

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Bu_siliang/article/details/80682909

前言:
最近项目中有用到广播,需要接收到广播传过来的值,在指定页面上使用是不是很简单呢,没错,这时候有人说可以写局部广播啊,哪个页面需要用到哪个页面写广播啊,没错这的确是一个方法,但是如果说有五个页面你能五个都写么。这时候又会有人说,那就用全局啊,对 小白就是用的全局。那么我们如何将接受的值在指定页面时使用。其实方法很多(比如接口回调,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);
    }
}

搞定 是不是很简单呢!!

猜你喜欢

转载自blog.csdn.net/Bu_siliang/article/details/80682909
今日推荐