У меня есть buttonClickListener
, предназначенный для удаления нескольких приложений, поэтому я запустил цикл for для этого и хочу запустить onActivityResult
после завершения всего процесса удаления. Итак, onActivityResult
запускается после каждой деинсталляции. Мне нужен только один onActivityResult
в конце. Как я могу это сделать?
btnSelection.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for (int i = 0; i < appList.size(); i++) {
AllApps singleApp= appList.get(i);
if (singleApp.isSelected()) {
String app_pkg_name = singleApp.getPackageName();
Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE);
intent.setData(Uri.parse("package:" + app_pkg_name));
intent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
startActivityForResult(intent, UNINSTALL_REQUEST_CODE);
}
}
}
});
И это onActivityResult:
@Override
protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==UNINSTALL_REQUEST_CODE){
//things to do
}
}
Одно из возможных решений:
Вы можете поместить переменную i
в данные о намерениях и проверить, есть ли i==app.size()
на onActivityResult
.
Это простой вариант использования оператора If
. можно взять boolean
или просто проверить его состояние. Ознакомьтесь с кодом ниже.
btnSelection.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AllApps singleApp=null;
for (int i = 0; i < appList.size(); i++) {
if (appList.get(i).isSelected()) {
singleApp=appList.get(i);
}
}
if (singleApp!=null){
String app_pkg_name = singleApp.getPackageName();
Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE);
intent.setData(Uri.parse("package:" + app_pkg_name));
intent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
startActivityForResult(intent, UNINSTALL_REQUEST_CODE);
}
}
});
ПРИМЕЧАНИЕ ЕСЛИ appList
содержит несколько выбранных элементов, тогда будет использоваться последний проиндексированный элемент. В этом случае, если вы хотите, чтобы первый выбранный элемент, вам следует break
петли.
Я думаю, что было бы неплохо добавить логику для выполнения задачи, чтобы для результата оставался только последний выбранный объект.
Во-первых, это невозможно, но вы можете просто выполнить onActivityResult
для последней команды, и для этого вам сначала нужно иметь отфильтрованный список.
btnSelection.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// filter selected apps
List<AllApps> temp = new ArrayList<>();
for(AllApps app : appList){
if (app.isSelected())
temp.add(app);
}
// invoke app uninstallations
for (int i = 0; i < temp.size()-1; i++) {
startActivity(uninstallAppIntent(temp.get(i)));
}
// invoke get result for last entry
startActivityForResult(uninstallAppIntent(temp.get(temp.size()-1)), UNINSTALL_REQUEST_CODE);
}
});
// to avoid code duplicity
Intent uninstallAppIntent(Allapps singleApp){
String app_pkg_name = singleApp.getPackageName();
Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE);
intent.setData(Uri.parse("package:" + app_pkg_name));
intent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
return intent;
}
Я привел только логику. Я не думаю, что сразу несколько приложений можно удалить. Так что это нужно делать по одному.