5

ライフサイクルを何年も信頼した後、私は少し掘り下げました。今、私は面白がっていません。

私はそれについてたくさん知っていて読んでいますonStopが、呼ばれることが保証されているわけではありません。

2つのActiviteとカスタムApplicationクラスを使用して単純なアプリを作成しました。私は、4.1を搭載したGalaxy S2で見つけて遊んだすべてのコールバックに、Log.d()を配置しました。アクティビティAは開始時に起動し、その中onResumeでアクティビティBを開始します。アクティビティBには、Nullpointerを作成するボタンがありますが、それ以外の場合は何も実行しません。

今私を心配/混乱させるもの:

  • buttonclickでnullpointerを作成すると、アプリがクラッシュし、どちらのアクティビティでもコールバックが発生しません

  • 電源ボタンを押して画面をオフにすると、アクティビティの表示モード(縦向きまたは横向き)がデバイスのネイティブの向きと一致しない場合、アクティビティが再開されます。私はそれとどのようにそれをオーバーライドできるかを知っていますが、それが私の活動を破壊して再開した場合、それは呼び出してfalseonPauseisFinishing()返しますが、活動は終了して再開されています。

  • 上記が発生しない場合はonPause、アプリが表示されなくなっても呼び出されているだけです

  • Aで別のアクティビティ呼び出しonPauseを開始し、次にBを作成してからAのonResume呼び出しを作成しますonStop。現在、.Appクラスでアクティビティを追跡しています。Aを登録解除しonPauseてBを登録onResumeすると、アクティビティが登録されないミリ秒が分割されます。 。アクティビティがないときにサービスをシャットダウンしたい場合、それは常に発生します。しかし、登録を解除するとonStop(重複するため)、ユーザーが電源ボタンを押してサービス(またはスレッドなど)が実行を続け、バッテリーの電力を消費しても、登録が解除されることはありません。

私はかなり長い間Androidを使用していて、かなり複雑なデザインを実現しようとしています。しかし、私の活動に何が起こっているのかを追跡することはほとんど不可能です。

  • パワーダウンはIntent.ACTION_SCREEN_OFFを介して検出する必要がありますが、それはすでにオフになっている場合に発生します。その前の唯一のものはonPauseです。

  • ホームボタン...onUserInteractionと一時停止/停止の組み合わせ

私のAPP(1つのアクティビティだけでなく)が使用されなくなってバックグラウンドに置かれたとき、およびアクティビティ間を移行したとき、またはシステムによってシャットダウンされたときを簡単に判断するのは非常に困難です。.AppクラスにはonTerminate()、エミュレーターでのみ使用される終了のコールバックがないため、ドキュメントには記載されています。

たぶん、木々の間から森が見えないだけなのかもしれません...助けていただければ幸いです!

4

1 に答える 1

3

Androidのライフサイクルはかなり混乱する可能性があります。これまでのところ、自分の周りで何が起こっているのかを適切に把握できる方法は1つしか見つかりませんでした。

アプリは、呼び出されるなどのコールバックなしでいつでも殺される可能性があると常に想定しているように設計します。これはonDestroy()、コールバックがまったく呼び出される保証がないためです。

アクティビティの別の1つが前面に来ているために、アクティビティがバックグラウンドに入っているかどうかを確認する簡単な方法は、単純なフラグを使用することです。

boolean movingInApp = false;
....
movingInApp = true;
Intent intent...
.....
public void onPause() {
    if(movingInApp) {
        //Called because we're moving to another Activity in our own app
    }
}

public void onResume() {
    movingInApp = false;

}

movingInAppインテントなどを起動する前にの値をに設定することで、呼び出されたtrue理由を追跡できます。メソッドの後半で再度onPause()設定することを忘れないでください。システムがアプリをバックグラウンドに移動させる場合、これは誤りであり、アプリがあなたではなく他の誰かによってバックグラウンドに移動されたことを知っています。falseonResume()

例外が発生したときに何も呼び出されない場合、Androidは、キャッチされない例外がある場合は常にアプリプロセス全体を強制終了します。コンピューター上のプログラムを強制終了したときのように、アプリは単に実行を停止します。システムの強制終了は完全に警告なしで行われます。これ以上のコードはまったく実行されません。

于 2013-02-05T10:40:23.073 に答える