1

特定のフローで Android デバイスにアプリケーションをインストールしているときに、Android アプリケーションで非常に奇妙なバグを発見しました。

  1. playstore(旧バージョン)からアプリをインストールしました。

  2. アプリケーションを起動しました (今、私はホームスクリーンにいます.ie, HomeActivity)。

  3. 今、最新のビルドをインストールしてアプリをアップグレードしました(製品ビルドで、まだプレイストアにリリースされていません)。

  4. ランチャー アイコンをクリックし、ホーム画面が表示されるまで待ち、メニュー ボタンを押してアプリをバックグラウンドに保ちます。

  5. 次に、ランチャー アイコンをクリックしてアプリケーションを起動します。

この場合、Splash Screen( Activity) が起動され、ホーム画面に移動します。ログでonStop()は、HomeActivity の呼び出しが行われます。これは、Activity が破棄されないことを意味します。そのため、ランチャー アイコンをクリックすると、HomeActivity が再開され、代わりに、splashActivity が再作成されます。しかし、バックグラウンドからアプリを起動すると、アクティビティが再開され、スプラッシュ画面が表示されません。それは正しい行動ですか?もしそうなら、私は へのコールバックを取得していませんonDestroy()

以下は、マニフェスト内の私のアクティビティ コードです。

 <activity
            android:name="com.app.ui.HomeActivity"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:configChanges="orientation|keyboard|keyboardHidden|screenSize|screenLayout|uiMode"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustNothing">

        </activity>

        <activity
            android:name="com.app.ui.SplashActivity"
            android:label="@string/app_name"
            android:screenOrientation="sensorPortrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

起動モードを に設定しませんでしたSplashActivity。そしてしばらくすると正常になり、スプラッシュ画面が表示されなくなります。

また、アプリをバックグラウンドで起動するか、戻るボタンを押してからアプリのアイコンをクリックしても、このバグは再現されません。これは、ランチャー アイコンをクリックしたときにのみ発生し、アプリをバックグラウンドに保ち、しばらくすると適切になります。

また、アップデートせずにアプリをインストールしたところ、この問題は発生しませんでした。APKを更新したときのみ、これが発生します

なぜこれは最初の起動で発生するのですか..それはアンドロイドのバグですか..?もしそうなら、この問題を回避する方法..

4

1 に答える 1

0

バックグラウンドでしばらくするとアプリが閉じられるのは、デバイスのカーネルがその場所でより多くのプロセスを実行するためにプロセスを強制終了しているためです。アプリがバックグラウンドで実行されている間に他のアプリにアクセスしていると想定しているため、アプリが強制終了されます (したがって、Android ライフサイクルで onDestroy() 呼び出しをスキップします!)。

onDestroy() のアクティビティ ライフサイクルに関する Android デベロッパー ガイドのドキュメントから:

注: このメソッドがデータを保存する場所として呼び出されるとは考えないでください。たとえば、アクティビティがコンテンツ プロバイダのデータを編集している場合、それらの編集は、ここではなく onPause() または onSaveInstanceState(Bundle) でコミットする必要があります。このメソッドは通常、アクティビティに関連付けられているスレッドなどのリソースを解放するために実装されます。これにより、アプリケーションの残りの部分がまだ実行されている間に、破棄されたアクティビティがそのようなリソースを残さないようにすることができます。システムがこのメソッド (または他のメソッド) を呼び出さずにアクティビティのホスティング プロセスを単純に強制終了する状況があるため、プロセスがなくなった後も残り続けることを意図したことを行うために使用しないでください

ドキュメントへのリンク

于 2015-06-02T07:31:34.453 に答える