用觀察者模式,傳遞廣播中收的值
阿新 • • 發佈:2018-12-28
前言:
最近專案中有用到廣播,需要接收到廣播傳過來的值,在指定頁面上使用是不是很簡單呢,沒錯,這時候有人說可以寫區域性廣播啊,哪個頁面需要用到哪個頁面寫廣播啊,沒錯這的確是一個方法,但是如果說有五個頁面你能五個都寫麼。這時候又會有人說,那就用全域性啊,對 小白就是用的全域性。那麼我們如何將接受的值在指定頁面時使用。其實方法很多(比如介面回撥,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);
}
}
搞定 是不是很簡單呢!!