13

非常に少数のユーザーにとって、非常に紛らわしい問題に直面しています。別の Fragment アクティビティを開始する Fragment 内でボタンが押されると、エラーが発生します。スタック トレースは次のとおりです。

I/20:22:23.901 ActivityManager( 1668)
Start proc com.brandall.nutter for activity com.brandall.nutter/.ActivityHomeFragment: pid=8956 uid=10125 gids={50125, 3003, 3001, 3002, 1015, 1023, 1006, 1028}
I/20:22:23.881 WindowState( 1668)
WIN DEATH: Window{41ed1948 u0 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment}
W/20:22:23.881 ActivityManager( 1668)
Force removing ActivityRecord{411c4188 u0 com.brandall.nutter/.ActivityLinkAppsFragment}: app died, no saved state
I/20:22:23.881 WindowState( 1668)
WIN DEATH: Window{41b6a178 u0 Toast EXITING}
W/20:22:23.881 InputDispatcher( 1668)
Attempted to unregister already unregistered input channel '41ed1948 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment (server)'
W/20:22:23.871 ActivityManager( 1668)
Scheduling restart of crashed service com.brandall.nutter/.TTSS in 80000ms
I/20:22:23.871 ActivityManager( 1668)
Process com.brandall.nutter (pid 8907) has died.
I/20:22:23.871 WindowState( 1668)
WIN DEATH: Window{411d4ff0 u0 com.brandall.nutter/com.brandall.nutter.ActivityHomeFragment}
E/20:22:23.871 InputDispatcher( 1668)
channel '41ed1948 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment (server)' ~ Channel is unrecoverably broken and will be disposed!
W/20:22:23.871 InputDispatcher( 1668)
channel '41ed1948 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment (server)' ~ Consumer closed input channel or an error occurred.  events=0x9

エラーのこの行のために:

com.brandall.nutter/.ActivityLinkAppsFragment}: app died, no saved state

フラグメントの保存状態に関する多くの投稿を読んできましたが、スタック トレースに記載されていないフラグメント自体ではなく、私の状況には当てはまらないようです。他の投稿では、各フラグメントに追加することを提案しています:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}

現在、どのフラグメントでも onCreate メソッドをオーバーライドしていません。

これを各フラグメントに追加することも提案されています。

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    setUserVisibleHint(true);
}

非常に少数のユーザーにのみ発生しているという事実は別として、最も不可解な問題は、使用されるコンテキストにあります。

final Intent sa = new Intent(getActivity(), ActivityLinkAppsFragment.class);
getActivity().startActivity(sa);

私のアプリケーションにはフォアグラウンド サービスがあり、代わりに上記のインテントでその静的コンテキストを (静的 getServiceContext() メソッドを介して) 使用すると、ユーザーに対して問題が発生しなくなり、フラグメント アクティビティが正しく開きます。

別の Context を使用すると問題が発生しない理由がわかりませんが、私が提供した情報が誰かにとって意味のあるものになることを願っています!

私が使用している FragmentPagerAdapter コードが適切であることが判明した場合は提供できますが、これはかなり標準的なものです。

よろしくお願いします

編集- 追加するのを忘れていた非常に重要なこと。これによってアプリがクラッシュすることはありません。代わりに、フラグメントが入っているアクティビティがすぐに再起動されます。

回答System.exit(0)- これは、ユーザーがアプリのメモリ使用量を「フラッシュ」したい場合にのみ可能だと思っていた状況で電話をかけたことが原因でした。私は間違っていました。ユーザーのデバイスがメモリ不足の状態を処理しているときにも呼び出される可能性がありました。以下の@beworkerの回答はActivityManagerService.handleAppDiedLocked()、これの結果であると彼が指摘したように、正しいとマークされています。

4

1 に答える 1

11

スタック トレース内のメッセージの Android ソース コードを調べたところ、メソッドに由来することがわかりましたActivityManagerService.handleAppDiedLocked()。この方法の説明には次のように書かれています。

"そのプロセスがなくなった結果として、アクティビティ マネージャーから既存のプロセスを削除するための主な機能。プロセスへのすべての接続をクリアします。"

これは、アプリケーションが強制終了されたときに発生します。システム、別のアプリケーション (例: タスク マネージャー アプリ)、またはアプリケーションが単独で終了した場合 (例: System.exit(0)) によって強制終了される可能性があります。

于 2013-08-21T18:55:42.440 に答える