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の値がアプリケーション側から見えない( = 非公開)なので使用しないほうが良さげですね。