restartPackage

●Format
public void restartPackage(String packageName)
●Details
Have the system perform a force stop of everything associated with the given application package. All processes that share its uid will be killed, all services it has running stopped, all activities removed, etc. In addition, a ACTION_PACKAGE_RESTARTED broadcast will be sent, so that any of its registered alarms can be stopped, notifications removed, etc.
You must hold the permission RESTART_PACKAGES to be able to call this method.
●Parameters
packageName - The name of the package to be stopped.
●Reference
http://developer.android.com/reference/android/app/ActivityManager.html

【和訳】
このメソッドを実行すると、システムは引数で指定されたアプリケーションパッケージに関連した全てを強制停止する。そのuidを共有する全てのプロセスは殺され、全てのサービスは活動を停止し、全てのアクティビティは取り外される。さらに、登録したアラームを解除したり、ノティフィケーションを取り外したりできるように、「ACTION_PACKAGE_RESTARTED」というブロードキャストが通知される。
このメソッドをコールすためには、「RESTART_PACKAGES」というパーミッションを持っていなければならない。

【考察】
このメソッドは、リファレンスをざっと読んでいるだけだと終了メソッドのように思えるが、アクティビティの振る舞いを見ていると、どうやら違うようである。終了であるなら、onPause、onStop、onDestroy、という終了時のコールバック(代表的なライフサイクル)が走るはずだが、一切、まったく走らない。ということは、リファレンス上の”強制停止”は、このコールバックが走らないことを意味しているようである。確かに、「ACTION_PACKAGE_RESTARTED」というブロードキャストによってノティフィケーションやアラーム登録などを解除してくれと記載があるということは、終了させたパッケージは通常のonPause、onStop、onDestroyですべき処理がされないから、やってあげてくれ、と言っているようなものだ。そして「restartPackage」というこの名前が気になる。直訳すれば再起動であるが、この「再起動」の捉え方が日本人とは感覚的に違うのかもしれない。終了時の正常な処理をした上で、再度起動する、と捉えがちだが、今の状態は無しにして、はじめからやり直す、という風に捉えた方が、このメソッドの振る舞いは納得ができる。