Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

android notify when startActivity intent has completed?

I need to be able to tell when a spawned activity (via an intent) has completed, how would I do so?

This is what I have:

    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());
        }
    });

EDIT #1

Per the suggestions below, I've made some modifications. Now, however, the launched SMS activity just "sits there" once the text is sent. I can't figure out how to get it to return to the calling activity. This is what I have:

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());
    }
like image 399
javamonkey79 Avatar asked Aug 29 '11 18:08

javamonkey79


3 Answers

Use startActivityForResult(intent, positiveinteger);

Do what you want to do, in the started activity when you think activity has finished successfully, do setResult(Activity.RESULT_OK); finish();

And in the activity that started override onActivityResult() method. And test if your called activity finished it job.

Never ever ever ever use Activity.RESULT_OK for requestCode, because it is negative constant. And the Docs says that onActivityResult() method will be called for every positive integer requestCode:

Rewrite and follow this

How you start the activity for result:

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

In your startNewOne activity you finish with result like:

    //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
}

How do you use onActivityResult() method:

@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);

    }
like image 100
Nikola Despotoski Avatar answered Nov 19 '22 15:11

Nikola Despotoski


Followup Answer for second question: Out of curiosity, have you considered sending the text without creating an activity? The reason I ask is because it seems, from what I can tell, no user experience is happening within your SMS activity. If you don't have views and user interactions then maybe just defining a thread or creating a helper class would do the job.

Original Answer for first question: Try using startActivityForResult(Intent, int). Your current activity can get notified when the text message activity finishes.

like image 31
WindsurferOak Avatar answered Nov 19 '22 17:11

WindsurferOak


Unfortunately you will have to use SmsManager

Use this: SMS Messaging in Android | mobiForge

You can receive the SMS_SENT

Note: Make sure you are restarting your calling activity using onCreate()

like image 2
Sherif elKhatib Avatar answered Nov 19 '22 16:11

Sherif elKhatib