5

PackageManager.DONT_KILL_APPの API ドキュメントには次のように書かれています。

コンポーネントの状態を変更すると、含まれているアプリケーションの動作が予測不能になる可能性があるため、これを設定するときは注意してください。

残念ながら、予測不可能な動作が何を意味するのかについては詳しく説明していません。

私のアプリケーションでは、アクティビティの有効状態を切り替えています。まず、サービスがアクティビティを有効にして開始します。

getPackageManager().setComponentEnabledSetting(
    new ComponentName(MyService.this.getApplicationContext(),
    MyActivity.class),
    PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
    PackageManager.DONT_KILL_APP);

final Intent launchIntent = new Intent(context, MyActivity.class);
    launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
        | Intent.FLAG_ACTIVITY_CLEAR_TOP
        | Intent.FLAG_ACTIVITY_SINGLE_TOP);

context.startActivity(launchIntent);

(シングルトップ) アクティビティが再び開始されるか破棄されると、それ自体が再び無効に設定されます。

@Override
protected void onDestroy() {
    log.d("ON DESTROY");
    super.onDestroy();
    getPackageManager().setComponentEnabledSetting(getComponentName(),
        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
        PackageManager.DONT_KILL_APP);
}

@Override
protected void onNewIntent(Intent intent) {
    if (someCondition) {
        getPackageManager().setComponentEnabledSetting(getComponentName(),
            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
            PackageManager.DONT_KILL_APP);

        Intent i = new Intent();
        i.setAction(Intent.ACTION_MAIN);
        i.addCategory(Intent.CATEGORY_HOME);
        startActivity(i);

        finish();
        return;
    }

    super.onNewIntent(intent);
}

onResume()通常はすべて正常に動作しますが、作成されたオブジェクトが null で、onCreate()他の場所に触れていない場合があります。デバッガーでこの問題を再構築することはできませんでしたが、実際に以前に呼び出されたonResume()場合に不可能なNullPointerExceptions に関する多くのバグ レポートを受け取りました。onCreate()

これの簡単な例は次のとおりです。

private String s;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    s = new String("");
    ...
}

@Override
protected void onResume() {
    super.onResume();
    ...
    s.equals(""); // rarely causes NullPointerException
    ...
}

私の質問は次のとおりです。これは の予測できない動作PackageManager.DONT_KILL_APPでしょうか? または、これがどのように発生する可能性があるか、別の考えを持っている人はいますか?

4

1 に答える 1

0

はい、ほとんどの場合、アプリを強制終了させたくありませんが、システムがメモリを必要とし、一部のオブジェクトを破棄することがあります。アプリ自体はまだそこにあり、onResume() のみを呼び出しますが、以前に作成したすべてのオブジェクトはありません。

于 2013-02-19T15:42:45.940 に答える