Start an Activity from another Activity on Xamarin Android

29,270

Solution 1

You can write:

public void GoToActivity(Type myActivity)
{
            StartActivity(myActivity);
}

and call it like:

 GoToActivity(typeof(ActivityType));

or just write:

StartActivity(typeof(ActivityType));

Solution 2

void btnEntrar_Click(object sender,EventArgs e)
    { 
        var NxtAct= new Intent(this, typeof(Perguntas2));
        StartActivity(NxtAct);
    }

in my code i did this

Solution 3

This is how i've done it in my Applicaiton

    public void StartAuthenticatedActivity(System.Type activityType)
    {
        var intent = new Intent(this, activityType);
        StartActivity(intent);
    }

    public void StartAuthenticatedActivity<TActivity>() where TActivity: Activity
    {
        StartAuthenticatedActivity(typeof(TActivity));
    }

You can then add in the where TActivity : YourBaseActivity is a base activity that you have created

Solution 4

Read for Android 11+ (Android 11 introduces changes related to package visibility - use the <queries> element)

You have to declare the package names for apps you want to access activities from in the manifest file of the calling app, otherwise you will get ActivityNotFoundException:

<manifest>
....
    <queries>
        <package android:name="com.companyname.yourOtherApp" />
    </queries>
</manifest>

What you want to do is to first get the PackageManager:

PackageManager pm = Android.App.Application.Context.PackageManager; Then you can look for an intent to launch the Activity with:

Intent intent = pm.GetLaunchIntentForPackage(packageName); - If that's null, you could have logic to take the user to the PlayStore to install that app.

Final code:

            PackageManager pm = Android.App.Application.Context.PackageManager;

            Intent intent = pm.GetLaunchIntentForPackage(packageName);
            if (intent != null)
            {
                intent.PutExtra(Android.Content.Intent.ExtraPackageName, "com.companyname.callingActivityName");
                intent.SetFlags(ActivityFlags.NewTask);
                Android.App.Application.Context.StartActivity(intent);
            }
            else
            {
                Android.App.Application.Context.StartActivity(new Intent(Intent.ActionView).SetData(Android.Net.Uri.Parse("https://play.google.com/store/apps/details?id=" + packageName)));
            }

Notes: Feel free to use try/catch around all of this. The line intent.PutExtra is just a sample how to add some message for the other activity. You can get it on the other side by using in OnCreate:

var text = Intent.GetStringExtra(Android.Content.Intent.ExtraPackageName);

If you want to use that in OnResume, so that your app can receive a message if redirected to after it's already running (in which case OnCreate will not be hit), you'd have to override another method first. It will allow you to get the updated value:

    protected override void OnNewIntent(Android.Content.Intent intent)
    {
        base.OnNewIntent(intent);
        // Check not required, implement your own logic. This checks if a message was passed.
        if (intent.Extras != null)
            Intent = intent; // Intent.GetStringExtra now has the new value
    }

Now in OnResume, you can use the same method as before and it will contain the passed value:

var text = Intent.GetStringExtra(Android.Content.Intent.ExtraPackageName);

Share:
29,270
Lacho
Author by

Lacho

Updated on November 09, 2021

Comments

  • Lacho
    Lacho over 2 years

    I found this java code to create a generic method to start any activity from other activity.

    public void gotoActivity(Class activityClassReference)
    {
        Intent i = new Intent(this,activityClassReference);
        startActivity(i);
    }
    

    How can I convert that code to c# for xamarin-Android?

    Thanks in advance.

  • Jose Cordero
    Jose Cordero almost 5 years
    ¿it isn't too complicated? ¿What approach could benefit from this? Maybe looking if the Activity is hidden / instantiated, but otherwise, looks like an anti-KISS code.