3

我是安卓新手。我在一个应用程序中实现了一个选项卡。我在其中使用了 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 及其子项的方法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 需要哪个版本?

4

3 回答 3

8

onCreate 方法可以调用两次。

在android中,当运行其他应用程序时可用内存较少时。它可能会杀死您的应用程序,即使您的应用程序启动另一个应用程序也是如此。它甚至会在方向改变时被调用(如果 android:configChanges="orientation|keyboardHidden|screenSize" 没有为该活动提供)

与您的情况一样,您正在启动可能需要比可用内存更多的外部应用程序(Zxing)。结果,您的应用程序被终止,但带有保存实例的活动堆栈被保留)。

因此,当用户回到您的应用程序时。Android 框架以相同的状态和活动再次运行您的应用程序,这将导致调用您的 onCreate 方法(即再次创建活动)。

查找它是重新创建还是第一次运行。您可以检查 savedInstanceState 是否为空。如果它为空,则它第一次运行。

也可能是因为方向发生了变化,请尝试在清单中为活动添加 android:configChanges="orientation|keyboardHidden|screenSize"。

于 2013-02-21T10:07:28.077 回答
0

在使用第三方库时,我注意到了类似的行为,而且通常最简单的解决方案有点笨拙——但易于理解且易于实施。只需使用值跟踪是否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
    }
}
于 2013-02-21T16:29:55.377 回答
0

尝试以这种方式调用您的意图:

Intent intent = new Intent(this, CaptureActivity.class);
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
getParent().startActivityForResult(intent, 0);
于 2013-02-18T09:54:38.847 回答