2011年6月23日木曜日

設定アプリケーションから、アプリケーションの強制停止ボタンを押したら。

今日は、設定→アプリケーション→アプリケーションの管理→アプリケーションの詳細画面で
強制停止ボタンを押した時の挙動についてメモしておきたいと思います。

今回はAndroid2.2のソースコードを見た結果です。

ボタンを押すと、ActivityManager#forceStopPackage(String packageName)が
呼び出されます。

以下が、onClickメソッドの呼び出し元です。

} else if (v == mForceStopButton) {
            forceStopPackage(mAppInfo.packageName);

メソッド化されているのでその中身を見ると、確かにActivityManager#forceStopPackageが呼び出されているようです。

private void forceStopPackage(String pkgName) {
        ActivityManager am = (ActivityManager)getSystemService(
                Context.ACTIVITY_SERVICE);
        am.forceStopPackage(pkgName);
        checkForceStop();
    }
}

その後も、forceStopPackage()の中身も追いかけてみました。
ActivityManagerNative#getDefault()を呼び出しているようです。

public void forceStopPackage(String packageName) {
        try {
            ActivityManagerNative.getDefault().forceStopPackage(packageName);
        } catch (RemoteException e) {
        }
    }

getDefault()の中身は、よくわからないサービスが呼び出されていました。

static public IActivityManager getDefault()
    {
        if (gDefault != null) {
            //if (Config.LOGV) Log.v(
            //    "ActivityManager", "returning cur default = " + gDefault);
            return gDefault;
        }
        IBinder b = ServiceManager.getService("activity");
        if (Config.LOGV) Log.v(
            "ActivityManager", "default service binder = " + b);
        gDefault = asInterface(b);
        if (Config.LOGV) Log.v(
            "ActivityManager", "default service = " + gDefault);
        return gDefault;
    }

この後は結局見るのをやめたのですが、何かのサービスがいて、そのサービスが
プロセスをkillしているのかどうかは不明ですが、アプリケーションを終了させている
ようです。

サービスの中身は、以下のサイトに書いてあるような事がされているのでしょうか。
androidアプリをクリーンに終了させる方法
http://jp-shibax.air-nifty.com/blog/2010/05/android-e2dd.html

もう少し、ソースコードを追いかけてみる必要がありますが、
今日はこの辺でやめておきたいと思います。