web-dev-qa-db-ja.com

Android-再開されないアクティビティの停止の実行

アプリをバックグラウンドにプッシュし、whatsappやsmsのような他の操作を行うと、onResumeがうまく機能します。
しかし、最近、アプリがバックグラウンドであるときにfacebookアプリを開いたとき、何が起こるかわからないことがわかりました...
しかし、再開すると、アプリは誤動作します...
やらなければいけないことはしませんが、ホームページに戻って問題がなければうまくいきます。手伝ってください。

すべてのメッセージを含むLogcat(フィルターなし)

10-15 12:53:59.899: I/Adreno-EGL(32033): Remote Branch: quic/LNX.LA.3.5.1_RB1.1
10-15 12:53:59.899: I/Adreno-EGL(32033): Local Patches: NONE
10-15 12:53:59.899: I/Adreno-EGL(32033): Reconstruct Branch: AU_LINUX_Android_LNX.LA.3.5.1_RB1.04.04.02.048.018 + f2fd134 +  NOTHING
10-15 12:53:59.924: D/OpenGLRenderer(32033): Enabling debug mode 0
10-15 12:54:00.000: V/AlarmManager(7677): sending alarm Alarm{42cfa490 type 3 Android}
10-15 12:54:00.110: I/ActivityManager(7677): Displayed uk.org.humanfocus.hfi/.EvaluateTrainingActivity: +838ms
10-15 12:54:00.114: D/WifiStateMachine(7677): handleMessage: E msg.what=151572
10-15 12:54:00.114: D/WifiStateMachine(7677): processMsg: ConnectedState
10-15 12:54:00.114: D/WifiStateMachine(7677): processMsg: L2ConnectedState
10-15 12:54:02.258: V/AlarmManager(7677): sending alarm Alarm{42ebd600 type 1 com.facebook.katana}
10-15 12:54:02.274: V/AlarmManager(7677): sending alarm Alarm{42ec0ff0 type 1 com.Android.chrome}
10-15 12:54:02.428: D/hardware_info(7386): hw_info_append_hw_type : device_name = speaker
10-15 12:54:03.011: W/BroadcastQueue(7677): Permission Denial: broadcasting Intent { act=Android.net.conn.INET_CONDITION_ACTION flg=0x4000010 (has extras) } from null (pid=-1, uid=-1) requires com.facebook.permission.prod.FB_APP_COMMUNICATION due to registered receiver BroadcastFilter{41fdecd0 u0 ReceiverList{42b2f608 31941 com.facebook.katana/10103/u0 remote:429a17e8}}
10-15 12:54:03.011: W/BroadcastQueue(7677): Permission Denial: broadcasting Intent { act=Android.net.conn.CONNECTIVITY_CHANGE flg=0x4000010 (has extras) } from null (pid=-1, uid=-1) requires com.facebook.permission.prod.FB_APP_COMMUNICATION due to registered receiver BroadcastFilter{41fdecd0 u0 ReceiverList{42b2f608 31941 com.facebook.katana/10103/u0 remote:429a17e8}}
10-15 12:54:03.118: D/WifiStateMachine(7677): handleMessage: E msg.what=151572
10-15 12:54:03.118: D/WifiStateMachine(7677): processMsg: ConnectedState
10-15 12:54:03.118: D/WifiStateMachine(7677): processMsg: L2ConnectedState
10-15 12:54:03.140: D/WifiStateMachine(7677): handleMessage: X
10-15 12:54:03.141: D/GCoreFlp(8174): Unknown pending intent to remove.
10-15 12:54:03.145: W/fb4a(:<default>):AbstractMqttPushService(31941): Attempt to start service that is already started
10-15 12:54:03.242: D/WifiStateMachine(7677): handleMessage: E msg.what=131155
10-15 12:54:03.242: D/WifiStateMachine(7677): processMsg: ConnectedState
10-15 12:54:03.243: D/WifiStateMachine(7677): processMsg: L2ConnectedState
10-15 12:54:03.245: D/WifiStateMachine(7677): handleMessage: X
10-15 12:54:03.319: D/dalvikvm(31941): GC_CONCURRENT freed 1833K, 9% free 20190K/22072K, paused 5ms+7ms, total 86ms
10-15 12:54:03.320: D/dalvikvm(31941): WAIT_FOR_CONCURRENT_GC blocked 68ms
10-15 12:54:03.323: W/MediaPlayer-JNI(31941): MediaPlayer finalized without being released
10-15 12:54:03.452: W/BroadcastQueue(7677): Permission Denial: broadcasting Intent { act=Android.net.conn.CONNECTIVITY_CHANGE flg=0x4000010 (has extras) } from null (pid=-1, uid=-1) requires com.facebook.permission.prod.FB_APP_COMMUNICATION due to registered receiver BroadcastFilter{42b51d68 u0 ReceiverList{429feb50 31941 com.facebook.katana/10103/u0 remote:41fb8788}}
10-15 12:54:03.573: W/fb4a(:<default>):JACKSON_FALLBACK(31941): Using com.fasterxml.jackson.databind.deser.std.EnumDeserializer@42914bc8 to deserialize [simple type, class com.facebook.common.util.TriState]
10-15 12:54:03.587: W/fb4a(:<default>):JACKSON_FALLBACK(31941): Using com.fasterxml.jackson.databind.deser.std.EnumDeserializer@42bb3100 to deserialize [simple type, class com.facebook.contacts.graphql.contactprofiletype.ContactProfileType]
10-15 12:54:03.957: D/dalvikvm(31941): GC_CONCURRENT freed 3400K, 15% free 20455K/23952K, paused 4ms+7ms, total 88ms
10-15 12:54:03.957: D/dalvikvm(31941): WAIT_FOR_CONCURRENT_GC blocked 75ms
10-15 12:54:04.099: W/fb4a(:<default>):JACKSON_FALLBACK(31941): Using BeanSerializer for com.facebook.katana.newbookmark.qe.NewBookmarkConfig to serialize class com.facebook.katana.newbookmark.qe.NewBookmarkConfig
10-15 12:54:04.119: D/WifiStateMachine(7677): handleMessage: E msg.what=151572
10-15 12:54:04.120: D/WifiStateMachine(7677): processMsg: ConnectedState
10-15 12:54:04.120: D/WifiStateMachine(7677): processMsg: L2ConnectedState
10-15 12:54:04.124: D/WifiStateMachine(7677): handleMessage: X
10-15 12:54:04.177: W/fb4a(:<default>):JACKSON_FALLBACK(31941): Using com.fasterxml.jackson.databind.deser.std.EnumDeserializer@42a30980 to deserialize [simple type, class com.facebook.platform.webdialogs.PlatformWebViewActionManifest$FetchState]
10-15 12:54:04.197: I/dalvikvm(31941): Could not find method com.Android.internal.widget.ILockSettings$Stub.a, referenced from method com.facebook.keyguardtype.LockSettingsServiceKeyguardTypeResolver.b
10-15 12:54:04.197: W/dalvikvm(31941): VFY: unable to resolve static method 5338: Lcom/Android/internal/widget/ILockSettings$Stub;.a (Landroid/os/IBinder;)Lcom/Android/internal/widget/ILockSettings;
10-15 12:54:04.197: D/dalvikvm(31941): VFY: replacing opcode 0x71 at 0x0023
10-15 12:54:04.440: I/SBar.NetworkController(7758): onSignalStrengthsChanged SignalStrength: 19 0 -120 -160 -120 -1 -1 99 2147483647 2147483647 2147483647 2147483647 2147483647 gsm|lte 0 -108 -1 false 5 5 0 0 0 99 99 99 5 level=5
10-15 12:54:04.814: V/WebViewChromiumFactoryProvider(31941): Binding Chromium to main looper Looper (main, tid 1) {41f8cbd0}
10-15 12:54:04.815: I/LibraryLoader(31941): Expected native library version number "",actual native library version number ""
10-15 12:54:04.816: I/chromium(31941): [INFO:library_loader_hooks.cc(116)] Chromium logging enabled: level = 0, default verbosity = 0
10-15 12:54:04.817: I/BrowserStartupController(31941): Initializing chromium process, renderers=0
10-15 12:54:04.822: E/AudioManagerAndroid(31941): BLUETOOTH permission is missing!
10-15 12:54:04.864: W/chromium(31941): [WARNING:proxy_service.cc(890)] PAC support disabled because there is no system implementation
10-15 12:54:05.121: D/WifiStateMachine(7677): handleMessage: E msg.what=151572
10-15 12:54:05.121: D/WifiStateMachine(7677): processMsg: ConnectedState
10-15 12:54:05.122: D/WifiStateMachine(7677): processMsg: L2ConnectedState

そして、これはonResume()です

super.onResume();

        if (backgroundThreadRunning == true) {
            backgroundThreadRunning = false;
        }

        if (Constants.isVideoEditing)
            editingProgress.setVisibility(View.VISIBLE);
        else
            editingProgress.setVisibility(View.GONE);

        if (Constants.isAudioProcessing)
            addAudioProgress.setVisibility(View.VISIBLE);
        else
            addAudioProgress.setVisibility(View.GONE);

        if (isHomeKeyPressed() && !(isRecentActivity)) {
            isRecentActivity = false;
            homeKeyPressed(false);
            AlertDialog.Builder ab = new AlertDialog.Builder(
                    CreateTrainingActivity.this);
            ab.setMessage(
                    "Due to Other Application Launches, video process will be cancelled!\nAre you sure you want to cancel?")
                    .setPositiveButton("Yes", dialogClickListener)
                    .setNegativeButton("No", dialogClickListener).show();
        }

    };

編集:問題の修正方法

このコードをonResume()メソッドで記述しました

try {
    // check if any view exists on current view
    style = ((Button) findViewById(R.id.xyz_button));   
} catch (Exception e) {
    // Button was not found
    // It means, your button doesn't exist on the "current" view
    // It was freed from the memory, therefore stop of activity was performed
    // In this case I restart my app
    Intent i = new Intent();
    i.setClass(getApplicationContext(), MainActivity.class);
    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);
    // Show toast to the user
    Toast.makeText(getApplicationContext(), "Data lost due to excess use of other apps", Toast.LENGTH_LONG).show();
}
40
Salmaan

この問題について50セントを与えるだけです。例外をキャッチすることは確かに1つの可能性ですが、バックグラウンドでリソースがシステムによって殺されている問題に対処する正しい方法は、Androidの一般的な問題です。は:

onPause()は、アクティビティを離れるユーザーに対処する場所です。最も重要なことは、ユーザーが行ったすべての変更は、この時点でコミットする必要があることです(通常はデータを保持しているContentProviderに)。

重点は私のものです。しかし、これが意味することは、Androidライフサイクルは、通常の条件下でonPauseActivityまたはFragmentがバックグラウンドに送信されるときに呼び出されるように設計されていることです。彼らはこれをいくつかの Androidドキュメントページ で示唆しています:

アクティビティが一時停止状態になると、システムはアクティビティでonPause()メソッドを呼び出します。これにより、一時停止中に継続してはならない進行中のアクション(ビデオなど)を停止したり、万が一の場合に永久に保存する必要がある情報を保持したりできますユーザーは引き続きアプリを離れます。ユーザーが一時停止状態からアクティビティに戻ると、システムはそれを再開し、onResume()メソッドを呼び出します。

注:アクティビティがonPause()の呼び出しを受信すると、アクティビティが一時停止し、ユーザーがアクティビティにフォーカスを戻すことを示している可能性があります。ただし、通常は、ユーザーがアクティビティを離れる最初の兆候です。

しかし、最も役立つ可能性があるリソースは次の2つです。

http://developer.Android.com/training/basics/activity-lifecycle/stopping.html

http://developer.Android.com/training/basics/activity-lifecycle/recreating.html

おそらく失われたリソースで何が起こっているのでしょうか?

アクティビティがonStop()メソッドの呼び出しを受け取ると、アクティビティは表示されなくなり、ユーザーが使用していない間は不要なほぼすべてのリソースを解放する必要があります。アクティビティが停止すると、システムがシステムメモリを回復する必要がある場合、システムはインスタンスを破壊する可能性があります。 ...デフォルトでは、システムはバンドルインスタンス状態を使用して、アクティビティレイアウトの各Viewオブジェクトに関する情報(EditTextオブジェクトに入力されたテキスト値など)を保存します。そのため、アクティビティインスタンスが破棄されて再作成された場合、レイアウトの状態は以前の状態に復元され、コードは必要ありません。ただし、アクティビティには、アクティビティのユーザーの進行状況を追跡するメンバー変数など、復元する状態情報がさらに含まれている場合があります。

注:Androidシステムでアクティビティのビューの状態を復元するには、各ビューにAndroid:id属性で指定された一意のIDが必要です。

アクティビティ状態に関する追加データを保存するには、onSaveInstanceState()コールバックメソッドをオーバーライドする必要があります。システムは、ユーザーがアクティビティを離れるときにこのメソッドを呼び出し、アクティビティが予期せず破壊された場合に保存されるBundleオブジェクトに渡します。システムが後でアクティビティインスタンスを再作成する必要がある場合、同じBundleオブジェクトをonRestoreInstanceState()メソッドとonCreate()メソッドの両方に渡します。

これに対する正しい解決策は、必要に応じてアクティビティ/フラグメントのライフサイクルメソッドをオーバーライドおよび実装することです。

Google で与えられる2つの例:

    static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}
Caution: Always call the superclass implementation of onSaveInstanceState() so the default implementation can save the state of the view hierarchy.

そして、逆の復元操作:

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

    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}
15
HenriqueMS

1行:Android OSはFacebookアプリケーションにメモリを必要としたため、アクティビティ変数の一部がメモリから解放されたようです。

説明:フォアグラウンドのアプリケーションが使用可能なメモリより多くのメモリを必要とする場合、Androidはバックグラウンドで実行されているアプリからメモリを解放します。フォアグラウンドタスクは、常にバックグラウンドアプリケーションよりも高い優先度を持ちます。

そのため、アプリケーションがバックグラウンドであったときにアプリケーションに発生した可能性があるのは、onResume()で使用している変数の一部の値が失われたことです。このため、アプリを再びフォアグラウンドに戻すときに再作成され、コードの一部が正しく機能しないため、誤った値またはデフォルト値(Sysoutを使用して確認できます)を保持しています。

28
Whisky

すでに問題に対処していることを願っていますが、おそらく関連するコードにエラーがあります:

if (backgroundThreadRunning = true) {
    backgroundThreadRunning = false;
}

「if」ステートメントで比較する代わりに割り当てます。する必要があります:

if (backgroundThreadRunning == true) {
    backgroundThreadRunning = false;
}

または

if (backgroundThreadRunning) {
    backgroundThreadRunning = false;
}
7
Diarrhio