Запустить onActivityResult после завершения цикла

У меня есть 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 

        }
    }
0
0
262
3

Ответы 3

Одно из возможных решений:

Вы можете поместить переменную 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 петли.

Я привел только логику. Я не думаю, что сразу несколько приложений можно удалить. Так что это нужно делать по одному.

ADM 10.08.2018 06:25

Я думаю, что было бы неплохо добавить логику для выполнения задачи, чтобы для результата оставался только последний выбранный объект.

Pavneet_Singh 10.08.2018 06:28

Во-первых, это невозможно, но вы можете просто выполнить 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;
}

Другие вопросы по теме