在zxing上创建方法调用两次

时间:2013-02-15 07:29:08

标签: android tabs android-tabhost zxing

我是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需要哪个版本?

3 个答案:

答案 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
    }
}