您的位置:首页 > 移动开发 > Android开发

Android:相机调用与Activity生命周期

2015-08-01 10:13 477 查看
一个小项目,要用到相机拍照,保存拍照后,下一个界面就是扫描二维码。

参考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执行打开相机,程序就会出错。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二维码 相机