Search code examples
androidandroid-intent

How to stop an activity in android using intent?


I think this is a basic question. Is there any option to stop an activity by using intent.

Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:5554"));
startActivity(intent);

This is my code. I would like to stop this activity (That means, i want to drop this call) if the user is busy or something. What can I do for that? I tried this:

if (condition) {
    Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:5554"));
    startActivity(intent);
}else {
    this.finish();
}

But of no use. Does anybody have a suggestion?


Solution

  • I had this problem a few days ago, and I'm happy to tell you I've found a way around this.

    First of all, to the activity you want to stop add this in the AndroidManifest.xml:

    android:launchMode="singleTop"
    

    I'm going to use a CheckBox example. When it's checked the activity is started and when unchecked will kill the activity.

    Example Activity A is calling Activity B and then killing it using an intent.

    Code to be put in A:

    checkbox.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View arg0) {
                Intent intent = new Intent(A.this, B.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
                if (enable.isChecked()) {
                    intent.putExtra("keep", true);
                    startActivity(intent);
                }
                else
                {
                    intent.putExtra("keep", false);
                    startActivity(intent);
                }
            }
        });
    

    Code to be put into B:

    boolean keep;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.B);
        intent = this.getIntent();
        boolean keep = intent.getExtras().getBoolean("keep");
        if(keep==true)
        {
            //execute your code here
    
        }
     }
        @Override
    protected void onNewIntent(Intent intent)
    {
        super.onNewIntent(intent);
        keep = intent.getExtras().getBoolean("keep");
        if(keep==false)
        {
            B.this.finish();
        }
    }
    

    Explanation : What this basically does is, when the checkbox is checked it calls the activity and passes a boolean value, if it's true the activity is kept alive and is brought to the foreground. Now, if you don't pass the flag singleTop then many instances of this activity will be created. singleTop makes sure only the same instance is called. Now, when the checkbox is unchecked a new value for keep is passed which is verified in B. If unchecked, the Activity A will be passing false, and hence B terminates itself from within the onNewIntent() function.

    P.S - You can close Activity B from another Activity too. Just use If the other activity is C:

    Intent intent = new Intent(C.this, B.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    intent.putExtra("keep", false);
    startActivity(intent);