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