My client wants to put the app I developed to be in their launcher favorite and they are asking for the package name and class name of the launcher. Package name is quite straig
(Congrats on getting into their favorites, should you provide a Play link ;-)
As you say, the package name is easy, it is the defined in the manifest as a package
attribute of the manifest
element:
<manifest .... package="com.sushihangover.playscriptstarling2" ...>
The launcher class name is the class that is tagged within the Activity
C# class attribute, "MainLauncher = true"
In turn, this creates the activity
attribute fragment within the manifest:
<activity android:icon="@mipmap/icon" android:label="PlayScriptStarling2" android:name="md5d2519388ea1895e3e3594794d2e0c4ce.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Your class name is the full android:name
attribute since it does NOT begin with a period. This is a generated unique subclass identifier, thus in my example this is the full class name:
md5d2519388ea1895e3e3594794d2e0c4ce.MainActivity
While most people will never see this class ID, I highly recommend you override this generate class identifier and use the dot class notation that includes your package name.
Normally, this is done by providing a name using the android:name
that BEGINS with a period (this is standard Android class naming 101 ;-) but Xamarin currently does not support Android shorthand-style class names beginning w/ a dot so you need to use the fully qualified package name with your class ID name.
So the Main Activity attribute becomes:
[Activity(Label = "PlayScriptStarling2", Name = "com.sushihangover.playscriptstarling2.MyBigBadGameEveryOneShouldPlay", MainLauncher = true, Icon = "@mipmap/icon")]
And the generated manifest becomes:
<activity android:icon="@mipmap/icon" android:label="PlayScriptStarling2" android:name="com.sushihangover.playscriptstarling2.MyBigBadGameEveryOneShouldPlay">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
And my launcher class name becomes:
com.sushihangover.playscriptstarling2.MyBigBadGameEveryOneShouldPlay
Android Docs:
Declaring class names
Many elements correspond to Java objects, including elements for the application itself (the element) and its principal components — activities (), services (), broadcast receivers (), and content providers ().
If you define a subclass, as you almost always would for the component classes (Activity, Service, BroadcastReceiver, and ContentProvider), the subclass is declared through a name attribute. The name must include the full package designation. For example, an Service subclass might be declared as follows:
<manifest . . . >
<application . . . >
<service android:name="com.example.project.SecretService" . . . >
. . .
</service>
. . .
</application>
</manifest>
However, as a shorthand, if the first character of the string is a period, the string is appended to the application's package name (as specified by the element's package attribute).
The following assignment is the same as the one above:
<manifest package="com.example.project" . . . >
<application . . . >
<service android:name=".SecretService" . . . >
. . .
</service>
. . .
</application>
</manifest>
When starting a component, Android creates an instance of the named subclass. If a subclass isn't specified, it creates an instance of the base class.
Ref: http://developer.android.com/guide/topics/manifest/manifest-intro.html
Ref: https://developer.xamarin.com/guides/android/advanced_topics/working_with_androidmanifest.xml/#Intent_Actions_and_Features