Settingsアプリのアプリケーション詳細画面を呼び出してみる ICS編

呼び出し方法

APIレベル9よりSettingsクラスに追加された「ACTION_APPLICATION_DETAILS_SETTINGS」。
android-4.0.X_r1以降、Settingsアプリ自体がFragmentでリファクタリングされており、使用方法を見直してみました。


Fragmentから以下のように、アプリケーション詳細画面を呼び出してみました。

public class MyFragment extends Fragment {
            :
            :
	startActivityForResult(new Intent("android.settings.APPLICATION_DETAILS_SETTINGS",
		     		                          Uri.parse("package:" + adapter.getItemPackageName(position) ))
			                       ,0); 
            :
            :

Settingsのソースを確認する

上記のIntentにより、以下のクラスが呼び出されます。
packages/apps/Settings/src/com/android/settings/applications/InstalledAppDetails.java

このクラスのソースコードを確認すると、アンインストール・ボタンを押下するとUninstall Activityを起動します。

            :
    private void uninstallPkg(String packageName) {
         // Create new intent to launch Uninstaller activity
        Uri packageURI = Uri.parse("package:"+packageName);
        Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
        startActivity(uninstallIntent);
        setIntentAndFinish(true, true);
    }
            :

ちなみに、Uninstall Activityのクラスはこちら。
packages/apps/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java


と、ここで

setIntentAndFinish(true, true);

に、注目です。

モジュールの中身を確認すると、以下のような処理を行っています。

    private void setIntentAndFinish(boolean finish, boolean appChanged) {
        if(localLOGV) Log.i(TAG, "appChanged="+appChanged);
        Intent intent = new Intent();
        intent.putExtra(ManageApplications.APP_CHG, appChanged);
        PreferenceActivity pa = (PreferenceActivity)getActivity();
        pa.finishPreferencePanel(this, Activity.RESULT_OK, intent);
    }

以下のPreferenceActivity#finishPreferencePanelで呼び出し元のFragmentに、Activity.RESULT_OKを返しています。

pa.finishPreferencePanel(this, Activity.RESULT_OK, intent);

呼び出し元で結果確認

呼び出し元のFragmentにてアプリケーション詳細画面にてアンインストール・ボタンを押下したかどうか確認することが可能です。

public class MyFragment extends Fragment {
            :
            :
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
    	super.onActivityResult(requestCode, resultCode, data);
    	if(resultCode == Activity.RESULT_OK ){
    		
    	}
    }
            :
            :

InstalledAppDetails.java側でputExtra(ManageApplications.APP_CHG, appChanged);を行っているので、

boolean isChange = data.getBooleanExtra("chg",false);

と、ステータス変更を行ったかどうか取得が可能ですが、ManageApplications.APP_CHGの値がアプリケーション側から見えない( = 非公開)なので使用しないほうが良さげですね。