在開發掃描槍掃碼接收廣播條碼的時候,由於廠商如shit般的文檔和對Anroid基礎知識的缺失,走了一些彎路,以下是廣播接收條碼並使用的代碼實現 :
1 : 動態注冊廣播
PDA掃描槍對掃碼有強大支持,在原生自帶的掃描服務中可以配置多種掃描模式,廣播傳遞掃碼結果是相對先進的。
首先 PAD 掃描槍在掃碼解析后是會自動發送廣播的,注冊解析掃碼結果的廣播后,可以在廣播類中直接獲取。
再項目開發環境中,相應業務代碼是寫在Activity中的,目前的需求是按下掃碼按鍵,接收廣播數據並在Activity中進行相關業務實現。
在開發者模式與AndroidStudio進行調試連接后按鍵按鍵AndroidStudio的運行日志會自動打印按鍵的KeyCode:
D/MultiTapKeyListener: keyCode=139 mInputMode=0
最開始的想法是這么寫 :
if (keyCode == 139 && event.getAction() == KeyEvent.ACTION_DOWN) {
接收數據啟動業務線程
}
對掃碼按鍵進行監聽,按下后系統發送廣播,廣播接收器接收到掃描數據存放在靜態變量中,然后在Activity中進行獲取。
然而廣播發送接收和Activity代碼執行時異步的,Activity中獲取的掃碼結果為null,而廣播接收器則可以接收數據。
2 : 使用接口回調
package he3.sd.adapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.EditText;
import android.widget.Toast;
import he3.sd.util.Base;
import he3.sd.util.Utility;
/**
* Created by asd25 on 2018/7/20 0020.
*/
public class ScanCodeBroadcastReceiver extends BroadcastReceiver {
private EditText editText;
private OnReceiveCode onReceive;
private String TAG = "ONR";
@Override
public void onReceive (Context context, Intent intent){
Base.barCode = intent.getStringExtra("Scan_context");
editText.setText(Base.barCode);
Base.op = Utility.getBarCodeType(Base.barCode);
editText.clearFocus();
editText.setText("");
onReceive.notifynThread(Base.barCode);
}
interface OnReceiveCode{
void notifynThread(String Code);
}
public void setOnReceive(OnReceiveCode onReceive,EditText editText) {
this.onReceive = onReceive;
this.editText = editText;
}
}
在廣播接收器中定義接口,和初始化接口的方法。
整體邏輯為: 啟動擁有掃碼模塊的Activity之后會自動動態注冊掃碼廣播,接着在廣播類中定義回調接口,在接收模塊實現方法,就可以在收到條碼后執行業務代碼。
在 Activity 中動態注冊廣播接收器,實現廣播接收器定義的接口 :
public class ScanOperationAdapterPage extends AppCompatActivity implements View.OnClickListener,ScanCodeBroadcastReceiver.OnReceiveCode{
ScanCodeBroadcastReceiver setOnReceive;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_adapterlayout);
userInfo = gson.fromJson(Tools.getUserInfo(ScanOperationAdapterPage.this), User.class);
initView();
initActionBar();
initEvents();
dataReset();
initBroadcastReceiver();
/注冊廣播接收器
}
private void initBroadcastReceiver() {
setOnReceive = new ScanCodeBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.android.scanservice.scancontext");
registerReceiver(setOnReceive,intentFilter);
setOnReceive.setOnReceive(this,IP);
}
@Override
public void notifynThread(String Code) {
Thread scanBarCodeThread = new Thread(new scanBarCodeServer());
scanBarCodeThread.start();
}
