Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Start an Activity from another Activity on Xamarin Android

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.

like image 561
Lacho Avatar asked Oct 24 '14 07:10

Lacho


People also ask

What method can an activity use to start another activity?

To start an activity, use the method startActivity(intent) . This method is defined on the Context object which Activity extends. The following code demonstrates how you can start another activity via an intent. # Start the activity connect to the # specified class Intent i = new Intent(this, ActivityTwo.

How do I navigate one activity to another activity?

We can send the data using the putExtra() method from one activity and get the data from the second activity using the getStringExtra() method.


1 Answers

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

like image 134
iBobb Avatar answered Sep 21 '22 11:09

iBobb