Android уведомить, когда startActivity намерение завершено? - PullRequest
7 голосов
/ 29 августа 2011

Мне нужно знать, когда закончилась порожденная деятельность (через намерение), как мне это сделать?

Вот что у меня есть:

    alertDialog.setButton2("Text", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            String uri = "smsto:" + "";
            Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uri));
            intent.putExtra("sms_body", PASSWORD_GENERATOR
                    .generatePasswordForSeed(seedText, hourToUse));
            intent.putExtra("compose_mode", true);

            // -- open the text message activity
            startActivity(intent);

            // -- I need to reset the calling activity now, but AFTER the text message activity has completed. Right now the SMS closes right away as I have no wait in...
            finish();
            startActivity(getIntent());
        }
    });

РЕДАКТИРОВАТЬ # 1

В соответствии с предложениями ниже, я сделал некоторые изменения.Однако теперь запущенная SMS-активность просто «сидит там» после отправки текста.Я не могу понять, как заставить его вернуться к вызывающей деятельности.Вот что у меня есть:

alertDialog.setButton2("Text", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                String uri = "smsto:" + "";
                Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uri));
                intent.putExtra("sms_body", PASSWORD_GENERATOR
                        .generatePasswordForSeed(seedText, hourToUse));
                intent.putExtra("compose_mode", true);

                startActivityForResult(intent, Activity.RESULT_OK);

                registerReceiver(new BroadcastReceiver() {
                    @Override
                    public void onReceive(Context context, Intent intent) {
                        finish();
                        startActivity(getIntent());
                    }

                }, new IntentFilter("SMS_SENT"));

                ContentResolver contentResolver = getContentResolver();
                Handler handler = new Handler();

                contentResolver.registerContentObserver(Uri
                        .parse("content://sms"), true, new ContentObserver(
                        handler) {

                    @Override
                    public boolean deliverSelfNotifications() {
                        setResult(Activity.RESULT_OK);
                        finish();

                        return super.deliverSelfNotifications();
                    }

                    @Override
                    public void onChange(boolean selfChange) {
                        super.onChange(selfChange);

                        setResult(Activity.RESULT_OK);
                        finish();
                    }
                });
            }
        });

        alertDialog.show();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        finish();
        startActivity(getIntent());
    }

Ответы [ 4 ]

10 голосов
/ 29 августа 2011

Используйте startActivityForResult(intent, positiveinteger);

Делайте то, что вы хотите сделать, в начальном действии, когда вы думаете, что действие успешно завершилось, выполните setResult(Activity.RESULT_OK); finish();

И в задании, котороеначал переопределять метод onActivityResult().И проверьте, закончила ли ваша вызванная деятельность свою работу.

Никогда и никогда не используйте Activity.RESULT_OK для requestCode, потому что это отрицательная постоянная.И в Документах говорится, что метод onActivityResult() будет вызываться для каждого положительного целого числа requestCode:

Перепишите и следуйте этому

Как запустить действие для результата:

      static final int STATIC_RESULT=2; //positive > 0 integer.
      Intent i = new Intent("my.activity.startNewOne");
      i.putExtra("category", category);
    startActivityForResult(i, STATIC_RESULT);

В вашей startNewOne деятельности вы заканчиваете с результатом как:

    //after the job is done, use the method i mentioned in the comments to check if the sms is delivered/submitted. and proceed if true with this
    if(smsObject.getStatus()==0)//by the docs means successfuly sent
{
    Intent i = getIntent(); //get the intent that has been called, i.e you did called with startActivityForResult();
    i.putExtras(b);//put some data, in a bundle
    setResult(Activity.RESULT_OK, i);  //now you can use Activity.RESULT_OK, its irrelevant whats the resultCode    
    finish(); //finish the startNewOne activity
}

Как вы используете onActivityResult() метод:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

          if (requestCode == STATIC_RESULT) //check if the request code is the one you've sent
          {
                 if (resultCode == Activity.RESULT_OK) 
                 {
                // this is successful mission, do with it.

                 {
                 } else
                         // the result code is different from the one you've finished with, do something else.
                     }
          }


        super.onActivityResult(requestCode, resultCode, data);

    }
5 голосов
/ 29 августа 2011

Продолжение Ответ на второй вопрос: Из любопытства вы рассматривали возможность отправки текста без создания активности?Причина, по которой я спрашиваю, заключается в том, что, судя по тому, что я могу сказать, пользователь не испытывает никаких впечатлений от вашей SMS-активности.Если у вас нет представлений и взаимодействий с пользователем, то, возможно, только определение потока или создание вспомогательного класса сделает эту работу.

Оригинальный ответ на первый вопрос: Попробуйте использовать startActivityForResult (Intent,целое).Ваше текущее действие может быть уведомлено, когда действие текстового сообщения заканчивается.

2 голосов
/ 02 сентября 2011

К сожалению, вам придется использовать SmsManager

Используйте это: SMS-сообщения в Android | mobiForge

Вы можете получить SMS_SENT

Примечание : Убедитесь, что вы перезапускаете свою функцию вызова с помощью onCreate()

1 голос
/ 14 февраля 2013

Чтобы ответить на ваш новый вопрос, вы можете добавить exit_on_sent к намерению, что приведет к возврату активности SMS после отправки приглашения.

smsIntent.putExtra("exit_on_sent", true);

К сожалению, похоже, что он по-прежнему возвращает resultCode из Activity.RESULT_CANCELLED, независимо от того, делаете ли вы это таким образом или они нажимают кнопку «Назад», поэтому вы не можете определить, действительно ли пользователь отправил текст или нет .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...