1

アプリの特定の時点で、アプリを完全に再起動します。つまり、アプリに関連付けられているプロセスを強制終了してから、もう一度再起動します。私のアプリには多くのビットマップが含まれているため、ヒープスペースを解放するためにこれを行いたいです。

私はこの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 つの活動はViewFlipper5 ~ 8 台の画面で使用します。

私はすべてのアクティビティで unbindDrawables() を使用してますが、メモリのごく一部しか解放しません。onStop()onDestroy()

したがって、アプリプロセスを完全に再起動しようとしています。

編集 2

私はちょうどこれに出くわしました:

さらに、Android ではビットマップ メモリの割り当て方法が変更されました。Android 3.0 より前は、ビットマップはネイティブ メモリに割り当てられ、小さな記述子だけが Java ヒープに保持されていました。現在、ビットマップ全体が Java ヒープから割り当てられています。これにより、複数のビットマップがメモリに保持されている場合、Java ヒープがすぐに使い果たされる可能性があります。

これが、私のアプローチが 4.0 OS のデバイスではなく 2.3OS のデバイスで機能する理由だと思います。

4

5 に答える 5

0

このhow to programmatically "restart" android app?でOleg Koshkinのトップ投票の回答を試してみてください。. これがあなたを助けることを願っています。

Intent mStartActivity = new Intent(context, StartActivity.class);
int mPendingIntentId = 123456;
PendingIntent mPendingIntent = PendingIntent.getActivity(context,  mPendingIntentId,    mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
System.exit(0);
于 2016-02-08T07:26:23.943 に答える
0

一部の人々からの提案の後、アプリの実行中にコードを使用してアプリを終了/再起動することは理想的ではない/推奨されないという結論に達しました。

だから、私がやったことは - アプリのホームボタンクリックieexitを識別するフラグを設定することです

その際、android.os.Process.killProcess(android.os.Process.myPid());現在のアプリのプロセスを完全に強制終了し、バックグラウンドでのアプリの実行を回避するために呼び出します。

皆さんありがとう !

于 2013-10-11T10:31:39.293 に答える