各位大神们,请问Activity的生命周期会不会这样:
场景:一个Activity 启动另一个Activity
原因:正常情况 第一个Activity先 onPause 第二个Activity 在onResume
问题,有没有可能会反过来? 就是第二个Activity 先onResume 第一个Activity在onPause
在ScanUserActivity 的 onResume 初始化了RFID读取线程的监听器,onPause 停止监听器,并销毁线程。接着跳转到扫描RFID的界面。
在ScanRfidActivity 界面的 onResume 初始化了RFID读取线程的监听器,onPause 停止监听器,并销毁线程。
正常逻辑是没问题的。但是在项目中。十次有两次会出现,线程监听器为空的情况。
还有一种情况就是,在扫描RFID(ScanRfidActivity)的界面,调用的是扫描用户(ScanUserActivity)的接口
如下是项目的相关代码。
进入ScanUserActivity
public void transport(View view) {
if (ModuleManager.getInstance().canHand()) {
MenuActivity.Key_PACK_MODE = MenuActivity.Key_PACK_Tran;
startActivity(ScanUserActivity.class);
} else {
T.showLong("请申请操作权限");
}
}
扫描到数据后,请求接口,并跳转到ScanRfidActivity
JSONObjectDialogCallBack Context已经声明为软引用了
public class ScanUserActivity extends BaseScanBarCodeAndRfidActivity {
@Override
protected void onResume() {
super.onResume();
//设置图标
setTitleRightImage(R.mipmap.scan_icon, new View.OnClickListener() {
@Override
public void onClick(View v) {
//设置按钮扫描
MyApplication.getPosApiService().scan();
}
});
}
@Override
protected void getRfidCode(String rfid) {
if (!mCurrentRfid.equals(rfid))
//rfid结果
reqUserInfo(SPUtil.getLoginUserId(), rfid);
}
@Override
protected void getBarCode(String barCode) {
// 扫描二维码结果
reqUserInfo(SPUtil.getLoginUserId(), barCode);
}
private void reqUserInfo(long UserId, String Username) {
OkGo.get(UrlsConstant.GetUser)
.params("Username", Username)
.params("UserId", UserId)
.execute(new JSONObjectDialogCallBack(mContext) {
@Override
public void onSuccess(Response response) {
String data = response.body().optString("data");
PackUserInfoData packUserInfoData = GsonUtil.j2o(data, PackUserInfoData.class);
PackUserInfoData.putDisk(mContext, packUserInfoData);
if (MenuActivity.Key_PACK_MODE == MenuActivity.Key_PACK_Tran) {
startActivityAndFinish(ScanRfidActivity.class);
} else {
startActivityAndFinish(SelectHandModeActivity.class);
}
}
});
}
}
public class ScanRfidActivity extends BaseScanRfidActivity {
@Override
protected void getRfidCode(String rfid) {
if (!mCurrentRfid.equals(rfid)) {
getRfidData(SPUtil.getLoginUserId(), rfid);
}
}
private void getRfidData(long UserId, final String RfidCode) {
OkGo.get(UrlsConstant.GetRubbishByRfidCode)
.params("UserId", UserId)
.params("RfidCode", RfidCode)
.execute(new JSONObjectDialogCallBack(mContext) {
@Override
public void onSuccess(Response response) {
startActivity(RegPackActivity.class, RfidCode);
finish();
}
});
}
}
扫描二维码和RFID的基类
public abstract class BaseScanBarCodeAndRfidActivity extends BaseActivity {
protected String mCurrentRfid = "";
private PosRfidService mRfidService;
@Override
protected void onPause() {
super.onPause();
MyApplication.getPosApiService().unRegScanKeyDownReceiver();
MyApplication.getPosApiService().unRegScanResultBroadcastReceiver();
mRfidService.stop();
}
@Override
protected void onResume() {
super.onResume();
mRfidService = MyApplication.getRfidService();
mRfidService.read(new BeeScanResultListener() {
@Override
public void result(String result) {
super.result(result);
getRfidCode(result);
mCurrentRfid = result;
}
});
MyApplication.getPosApiService().regScanKeyDownReceiver(new ScanKeyDownListener());
MyApplication.getPosApiService().regScanResultBroadcastReceiver(new BeeScanResultListener() {
@Override
public void result(String barCode) {
super.result(barCode);
if (!TextUtils.isEmpty(barCode)) {
getBarCode(barCode);
}
}
});
}
protected abstract void getRfidCode(String rfid);
protected abstract void getBarCode(String barCode);
}
public void stop() {
runFlag = false;
mRfidReader.setScanResultListener(null);
mRfidReader.interrupt();
mRfidReader = null;
}
public void read(ScanResultListener scanResultListener) {
runFlag = true;
mRfidReader = new RfidReader(scanResultListener);
//线程池
mRfidThreadServer.submit(mRfidReader);
}
private class RfidReader extends Thread {
private ScanResultListener mScanResultListener;
public RfidReader(ScanResultListener scanResultListener) {
mScanResultListener = scanResultListener;
}
public void setScanResultListener(ScanResultListener scanResultListener) {
mScanResultListener = scanResultListener;
}
@Override
public void run() {
super.run();
while (runFlag && !isInterrupted()) {
//实时盘存
.......
final String epcStr = Tools.Bytes2HexString(epc, epc.length);
//这个位置的监听器会是空的。
if (mScanResultListener != null) {
mScanResultListener.result(epcStr.trim());
}
try {
sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
return;
}
}
}
}