一个小项目,要用到相机拍照,保存拍照后,下一个界面就是扫描二维码。
参考github里面的大师的项目,分别完成了程序。经过测试,分开两个界面单独调用没问题。
可是,将两个界面连接起来,在拍照保存Activity(简称A)跳转时候,跳到第二个界面扫描二维码(简称B)时候,提示相机出错。
A中:相机初始化打开和设置参数的代码都在onCreate里面,一个类搞定。使用EasyCamera。
B中:大牛都是在onResume和onPause中开启关闭相机的。这个写法复杂一点。需要设置管理相机的类等。如:Zxing。
思考一下:单独调用A,在A按back键或者home键退出,调用系统默认相机都正常,然后再重新返回A,相机都正常运作。只是:A中的一个按钮BtnA 打开B,就出错。应该是打开B时候,A没有关闭或者释放相机资源。
测试一下生命周期:
A 的代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activityA);
ShowMsg("A Create.");
btn1 = (Button) findViewById(R.id.buttonA1);
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ShowMsg("BtnA1 Click And Start CycleB");
Intent intent = new Intent(ActivityA.this, ActivityB.class);
startActivity(intent);
ShowMsg("Start CycleB at A, And Finish A.");
finish();
}
});
}
@Override
protected void onResume() {
super.onResume();
ShowMsg("A1 Resume");
}
@Override
protected void onPause() {
super.onPause();
ShowMsg("A1 Pause");
}
B的代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_activity_cycle_b);
ShowMsg("B Create.");
btn2 = (Button) findViewById(R.id.buttonB2);
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ShowMsg("BtnB2 Click Finish");
finish();
}
});
}
@Override
protected void onResume() {
super.onResume();
ShowMsg("B2 Resume");
}
@Override
protected void onPause() {
super.onPause();
ShowMsg("B2 Pause");
}
运行结果:
跳转到B时候A先Pause 然后B才Create。这样A的相机应该还没有完全停止,关闭,明白了。
生命周期使用不当,影响整个程序的运作。
应该参考B的写法,重新理解Activity生命周期。
参考下图:最中间的[Another activity comes in front of then activity] 这个是一个重点,简单理解为一个要被开启的activity,也就是上图运行结果的:B还没被create,先停止A.Pause,此时,A的相机没被关闭或者释放,就在B执行打开相机,程序就会出错。