我是android新手。我在一个应用程序中实现了一个Tab。我在其中使用了Tab Host。在其中一个标签中,我实施了Zxing扫描条形码。
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.putExtra("com.google.zxing.client.android.SCAN.SCAN_MODE", "QR_CODE_MODE");
getParent().startActivityForResult(intent, 0);
现在,当扫描完成时,我已在我的TabGroupActivity中覆盖了活动结果,如。
@Override
public void onActivityResult(int requestCode,int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
}
现在的问题是扫描完成后我的Tab Activity会再次调用两次。
Tab Activity的onCreate()
和onResume()
方法及其子调用两次。我不希望它调用两次。
感谢您的帮助
首次修改
清单文件
<activity
android:name="com.google.zxing.client.android.CaptureActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:windowSoftInputMode="stateAlwaysHidden" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="com.google.zxing.client.android.SCAN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<receiver android:name=".TimeAlarm" />
<activity
android:name=".TabsWithFragmentsActivity"
android:theme="@android:style/Theme.Light.NoTitleBar"
android:screenOrientation="portrait">
</activity>
还有一件事我只是注意到我的应用程序表现不同。 在版本大于4.0的平板电脑上,它可以完美地工作。 但是对于Android平板电脑版本3.0,它的工作原理如上所述。如果有人可以提供帮助,我不确定Zxing需要哪个版本?
答案 0 :(得分:8)
onCreate方法可以调用两次。
在android中,当运行其他应用程序时可用内存较少。它可能会杀死您的应用,即使您的应用启动了另一个应用。方向更改时甚至会调用它(如果没有为该活动提供android:configChanges =“orientation | keyboardHidden | screenSize”)
与您的情况一样,您正在启动外部应用程序(Zxing),这可能需要比可用内存更多的内存。结果,您的应用程序被终止,但保存了与保存实例的活动堆栈。
所以当用户回到你的应用程序时。 Android Framework使用相同的状态和活动再次运行您的应用程序,这将导致调用您的onCreate方法(即再次创建活动)。
查找是重新创建还是第一次运行。你可以检查savedInstanceState是否为null。如果它为null则会第一次运行。
也可能因为方向的改变,尝试为清单中的活动添加android:configChanges =“orientation | keyboardHidden | screenSize”。
答案 1 :(得分:0)
尝试以这种方式调用您的意图:
Intent intent = new Intent(this, CaptureActivity.class);
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
getParent().startActivityForResult(intent, 0);
答案 2 :(得分:0)
我在使用第三方库时已经注意到了类似的行为,而且最简单的解决方案通常有点hacky - 但易于理解且易于实现。只需使用onCreate
值跟踪static boolean
是否已被调用:
private static boolean hasBeenCreated = false;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
if (!hasBeenCreated)
{
hasBeenCreated = true;
//the rest of your onCreate code
}
}