2

編集:

したがって、この投稿は、再起動パスを使用してバックグラウンドから呼び出すときに、Android OS を高速にロードしてアプリケーションを特定の方法で再起動する方法についてでした 。このトピックについて、まったく保証なしで推測してください

アプリケーションがバックグラウンドにあるとき、3 つの状態を見ました。

  • アプリケーションは「ただ」バックグラウンドに送信され、コールバックすると、簡単に再表示されます(すべてがまだメモリ内にあります)

  • アプリがバックグラウンドでかなりの時間を費やしているか、Android OS に十分なストレスがかかっているため、私にとっては重いゲームを開始しました (ユーフロリア、文字どおり 1000 枚の写真を閲覧し、グルーポンと Gmail を見てうまくいきました)。この場合、それはバックグラウンドからコールバックされ、OS は最後のビューを前面に持ってきて onRestoreSavedInstance() を呼び出そうとします。

  • バックグラウンドでの時間が長すぎる、クラッシュ、または巨大な負荷... とにかく、バックグラウンドから呼び出されると、アプリケーションが完全に再起動します (onRestoreSavedInstance() はまったく呼び出されませんが、保存されたインスタンスバンドルなしで onCreate および Cie が呼び出されます)。

秘訣は、ケース 2 で削除された可能性があると思われるものを onSavedInstance() に保存し、onRestoreSavedInstance() で取得することです。ただし、これらの保存された変数、属性、パラメーターを onStart() メソッドの後に呼び出す必要があります (フラグメントの確かなアクティビティである可能性があります)。onRestoreSavedInstance() メソッドはプロセスのかなり遅い時間、つまりアクティビティの onStart() の後で呼び出されるため、これは必須です。これに関するグーグルのドキュメントを参照してください:

onCreate() 中に状態を復元する代わりに、システムが onStart() メソッドの後に呼び出す onRestoreInstanceState() を実装することを選択できます。システムは、復元する保存済みの状態がある場合にのみ onRestoreInstanceState() を呼び出すため、バンドルが null かどうかを確認する必要はありません。

したがって、フラグメントとアクティビティのライフサイクルの関係により、フラグメントの onResume() メソッドの前には何も参照できません: http://www.linuxforu.com/2011/05/android-fragments-api/

それは、最終的な修正者への歓迎です:)
デビッドへのThx

/***** フィン編集 *****/

私がアップグレードしなければならないアプリケーション (友人のスタートアップを支援する) は、十分な時間バックグラウンドにあると、バックグラウンドから戻ったときにクラッシュしました。次の場合は問題ありません。

  • アプリマネージャーから殺します
  • ホームボタン長押しで消す
  • 他のいくつかのアプリケーション (eufloria、temple run 2、gmail、endomondo) を使用した後、再度呼び出します。
  • 私がインターネットで見つけた、またはそれについて考えたすべてのケース。

クラッシュした唯一の方法は、そのような時間の後にバックグラウンドに来ることです. この問題は、2 人のお客様からも報告されています。

これらの件名と Google のドキュメントに関するいくつかの投稿を読みました。特に /u/CommonsWare からの投稿 です Android OS によるバックグラウンド アプリケーションのアンロードをエミュレートする方法は? しかし、これらも Androidエミュレーターでメモリ不足をどのようにシミュレートしますか? https://groups.google.com/forum/?fromgroups#!topic/android-platform/nifVOvknFsU

それ自体はそれほど重要ではありませんが、助けていただければ幸いです。

*CommonsWare が言ったのと同じ方法でアプリを強制終了した場合、長時間 (1 時間) および/または過剰なアプリケーションの使用後にのみクラッシュするのはなぜですか? または、クラッシュは他の問題に関連していますか?

*開発者は、それをテストするために長い休憩をどのようにシミュレートしますか? 解決したい場合は、このクラッシュを再現する必要があります。それはシングルトンの問題かもしれません。人々がそれについて話しているのを見ました。

知恵と指導を本当に感謝します!

編集:

クラッシュのログキャットです

  06-10 16:08:32.178: I/ActivityThread(26487): Pub com.snapcar.rider: com.snapcar.rider.provider.SCProvider
06-10 16:08:32.298: D/dalvikvm(26487): GC_CONCURRENT freed 255K, 10% free 12336K/13703K, paused 12ms+1ms, total 27ms
06-10 16:08:32.393: V/Localytics(26487): Opening new session
06-10 16:08:32.423: D/dalvikvm(26487): GC_CONCURRENT freed 219K, 10% free 12650K/13959K, paused 1ms+2ms, total 27ms
06-10 16:08:32.423: D/dalvikvm(26487): WAIT_FOR_CONCURRENT_GC blocked 14ms
06-10 16:08:32.423: W/CursorWrapperInner(26487): Cursor finalized without prior close()
06-10 16:08:32.448: D/SC - Auth(26487): Auth-instantiating AuthManager...
06-10 16:08:32.453: D/SC - BookingManager(26487): BookingManager-instantiating BookingManager...
06-10 16:08:32.518: D/SC - WebServiceManager(26487): WebServiceManager-ws type: preprod
06-10 16:08:32.518: D/SC - OtherUtils(26487): OtherUtils-language:fr
06-10 16:08:32.523: E/SC - SCMainActivity(26487): savedInstanceState != null, the application is RE-created
06-10 16:08:32.543: D/dalvikvm(26487): GC_CONCURRENT freed 226K, 10% free 12913K/14215K, paused 11ms+14ms, total 38ms
06-10 16:08:32.628: D/dalvikvm(26487): GC_CONCURRENT freed 145K, 9% free 13307K/14535K, paused 2ms+2ms, total 20ms
06-10 16:08:32.673: D/AndroidRuntime(26487): Shutting down VM
06-10 16:08:32.673: W/dalvikvm(26487): threadid=1: thread exiting with uncaught exception (group=0x40fd82a0)
06-10 16:08:32.678: E/AndroidRuntime(26487): FATAL EXCEPTION: main
06-10 16:08:32.678: E/AndroidRuntime(26487): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.snapcar.rider/com.snapcar.rider.SCMainActivity}: java.lang.NullPointerException
06-10 16:08:32.678: E/AndroidRuntime(26487):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100)
06-10 16:08:32.678: E/AndroidRuntime(26487):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
06-10 16:08:32.678: E/AndroidRuntime(26487):    at android.app.ActivityThread.access$600(ActivityThread.java:140)
06-10 16:08:32.678: E/AndroidRuntime(26487):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
06-10 16:08:32.678: E/AndroidRuntime(26487):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-10 16:08:32.678: E/AndroidRuntime(26487):    at android.os.Looper.loop(Looper.java:137)
06-10 16:08:32.678: E/AndroidRuntime(26487):    at android.app.ActivityThread.main(ActivityThread.java:4898)
06-10 16:08:32.678: E/AndroidRuntime(26487):    at java.lang.reflect.Method.invokeNative(Native Method)
06-10 16:08:32.678: E/AndroidRuntime(26487):    at java.lang.reflect.Method.invoke(Method.java:511)
06-10 16:08:32.678: E/AndroidRuntime(26487):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
06-10 16:08:32.678: E/AndroidRuntime(26487):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
06-10 16:08:32.678: E/AndroidRuntime(26487):    at dalvik.system.NativeStart.main(Native Method)
06-10 16:08:32.678: E/AndroidRuntime(26487): Caused by: java.lang.NullPointerException
06-10 16:08:32.678: E/AndroidRuntime(26487):    at com.snapcar.rider.fragment.BookingFormFragment.onCreateView(BookingFormFragment.java:332)
06-10 16:08:32.678: E/AndroidRuntime(26487):    at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source)
06-10 16:08:32.678: E/AndroidRuntime(26487):    at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source)
06-10 16:08:32.678: E/AndroidRuntime(26487):    at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source)
06-10 16:08:32.678: E/AndroidRuntime(26487):    at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(Unknown Source)
06-10 16:08:32.678: E/AndroidRuntime(26487):    at android.support.v4.app.FragmentActivity.onStart(Unknown Source)
06-10 16:08:32.678: E/AndroidRuntime(26487):    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1167)
06-10 16:08:32.678: E/AndroidRuntime(26487):    at android.app.Activity.performStart(Activity.java:5216)
06-10 16:08:32.678: E/AndroidRuntime(26487):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2073)
06-10 16:08:32.678: E/AndroidRuntime(26487):    ... 11 more

編集2:

riderID = Integer.parseInt(UserManager.getSharedInstance().getCurrentRider().getUniqueID());

今回クラッシュしたのは回線です。いつもここにあるとは限りません。しかし、これは、私がシングルトンまたは失われた値を指していたことを確認しますか? 今朝、次の投稿とガイドラインに従って、共有設定の保存を実装しようとしていたことに対抗するために:

@Override public void onSaveInstanceState(Bundle savedInstanceState) { Dbg.e(TAG, "onSavedInstance called"); if (UserManager.getSharedInstance().getCurrentRider() != null ){ Dbg.d(TAG, "We have a current rider"); Rider currentRider = UserManager.getSharedInstance().getCurrentRider(); savedInstanceState.putString(Rider.UNIQUEID_KEY, currentRider.getUniqueID()); (more attributes saved)

問題は、関数 onREstoreSavedInstance がここで呼び出されなかったことです。ユーザー インターフェイスの作成が速すぎるようです。

私は何をすべきか?後でフラグメントの呼び出しプロセスで UI を再定義しますか?

それとも、もっと複雑な問題があり、これは 1 つの限界点にすぎません (ここで解決すると、アプリケーションは後でクラッシュしますか?)

助けてくれてありがとう!続ける勇気が本当に増えました!

編集2:これは私の検索機能です:

public void onRestoreInstanceState(Bundle savedInstanceState) {
    Dbg.d(TAG,"the application is RE-created & called from onRestoreInstanceState");

    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

    // Restore state members from saved instance
    if (UserManager.getSharedInstance().getCurrentRider() == null) {
        Rider currentRider = new Rider();
        currentRider.setUniqueID(savedInstanceState.getString(Rider.UNIQUEID_KEY));
   }}

(その他の設定)

Override を書いていないことに気付きました & 作成したライダーを UserManager に設定していません。したがって、メソッドは、私が行っていた他のいくつかの証明で呼び出されます。私は今両方を追加します。再テストします。

編集 3-4 ?

null のライダーは次のとおりです。

06-10 17:05:14.248: E/SC - BookingFormFragment(837): it's the CurrentRider that is null  !!!
4

2 に答える 2

0

まず、 onResume() および onRestart() メソッドを実装しましたか?

別の方法として、アプリにログインが必要な場合 (Facebook、Google +、独自のサービスなど)、一定時間後に期限切れになるトークンを受け取ることができます。再開時に新しいトークン キーを要求する必要があります...

詳細については、LogCat を投稿してください。

エイドリアン

于 2013-06-10T13:37:58.877 に答える