アプリの特定の時点で、アプリを完全に再起動します。つまり、アプリに関連付けられているプロセスを強制終了してから、もう一度再起動します。私のアプリには多くのビットマップが含まれているため、ヒープスペースを解放するためにこれを行いたいです。
私はこのSOリンクを最も投票数の多い回答で使用し、次のような追加のアクティビティを作成しました:
/** This activity shows nothing; instead, it restarts the android process */
public class MagicAppRestart extends Activity {
// Do not forget to add it to AndroidManifest.xml
// <activity android:name="your.package.name.MagicAppRestart"/>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.exit(0);
}
public static void doRestart(Activity anyActivity) {
anyActivity.startActivity(new Intent(anyActivity.getApplicationContext(), MagicAppRestart.class));
}
}
MagicAppRestart.doRestart(this);
別のアクティビティの必要な場所からこのアクティビティを呼び出します。
問題は、Android 2.3 では問題なく動作しますが、4.0 では、このコードはアプリを終了するだけで、再起動しないことです。
私は何か間違ったことをしていますか?すべての OS で機能するこの問題の解決策はありますか?
また、私はすでに次のコードを試しましたが、プロセスを再起動しないため、ヒープを解放しないため、役に立ちません。
Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage( getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
どんな助けでも大歓迎です!
編集
アプリには、ホーム アクティビティを含む 7 つのアクティビティがあります。家での活動を除いて、他の 6 つの活動はViewFlipper
5 ~ 8 台の画面で使用します。
私はすべてのアクティビティで unbindDrawables() を使用していますが、メモリのごく一部しか解放しません。onStop()
onDestroy()
したがって、アプリプロセスを完全に再起動しようとしています。
編集 2
私はちょうどこれに出くわしました:
さらに、Android ではビットマップ メモリの割り当て方法が変更されました。Android 3.0 より前は、ビットマップはネイティブ メモリに割り当てられ、小さな記述子だけが Java ヒープに保持されていました。現在、ビットマップ全体が Java ヒープから割り当てられています。これにより、複数のビットマップがメモリに保持されている場合、Java ヒープがすぐに使い果たされる可能性があります。
これが、私のアプローチが 4.0 OS のデバイスではなく 2.3OS のデバイスで機能する理由だと思います。