javaandroidandroid-studioin-app-billing

What forces android activity to be destroyed when launching another activity


I'm trying to add in-app purchases and when I call
OpenIabHelper::launchPurchaseFlow function:

So in the end I left with GooglePlay window and my dead app

I tried to start another activity via startActivityForResult and it worked fine
(nothing was destroyed and onActivityResult was called), so it seems that problem is with OpenIAB library

Therefore there's my question:
What can possibly force my activity to be destroyed after calling OpenIabHelper::launchPurchaseFlow ?

It doesn't seem to be system because it has enough memory and as I said
startActivityForResult works fine.
Also there's no exceptions being trown so I'm puzzled

Any help would be appreciated

MyActivity.java

public class MyActivity extends AppCompatActivity {
    private OpenIabHelper m_helper;
    private Boolean m_bOpenIabInitialized = false;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        OpenIabHelper.Options.Builder builder = new OpenIabHelper.Options.Builder()
            .addAvailableStores(new GooglePlay(this,null))
            .addPreferredStoreName(OpenIabHelper.NAME_GOOGLE)
            .setStoreSearchStrategy(OpenIabHelper.Options.SEARCH_STRATEGY_INSTALLER_THEN_BEST_FIT)
            .setVerifyMode(OpenIabHelper.Options.VERIFY_SKIP)
            .setCheckInventory(false);
        m_helper = new OpenIabHelper(this, builder.build());
        m_helper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
            public void onIabSetupFinished(IabResult result) {
                m_bOpenIabInitialized = result.isSuccess();
            }
        });
    }


    public void onListViewItemClicked(String sku, String payload) {
        if (m_bOpenIabInitialized == null || !m_bOpenIabInitialized) return;
        m_helper.launchPurchaseFlow(this, sku, 10001, null, payload);
    }

    @Override
    public void startActivityForResult(Intent intent, int RequestCode) {
        // never reaches here
        Log.d(TAG, "startActivityForResult()");
    }

    @Override
    protected void onActivityResult(int RequestCode, int ResultCode, Intent data) {
        // never reaches here
        Log.d(TAG, "onActivityResult()");
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example" >

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="com.android.vending.BILLING" />

    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MyActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar"
            android:configChanges="orientation|screenSize|keyboardHidden|screenLayout">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Solution

  • Have you tried changing the activity's launchMode? Maybe the singleTop launch mode will preserve your activity:

    <activity
        android:name=".MyActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar"
        android:configChanges="orientation|screenSize|keyboardHidden|screenLayout"
        android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    

    You can find more about launch modes here: https://developer.android.com/guide/topics/manifest/activity-element.html#lmode