Zordid Zordid - 5 months ago 18
Android Question

When to use which constructor for ComponentName in Android?

I am a little bit confused about the ComponentName class in Android.

There are different ways to get to a component name object, but I don't know when to use which... and why!

Example:


  • Application package is
    de.zordid.sampleapp

  • but widget provider class is
    de.zordid.sampleapp.widget.WidgetProvider



Using

ComponentName cn = new ComponentName("de.zordid.sampleapp.widget",
"WidgetProvider");


I got this component info:
ComponentInfo{de.zordid.sampleapp.widget/WidgetProvider}
, but I could not use this - the component is unknown!
But the JavaDoc says I should give the package and the class within that package - and that is what I did, didn't I??

Using

ComponentName cn = new ComponentName(context, WidgetProvider.class);


yields
ComponentInfo{de.zordid.sampleapp/de.zordid.sampleapp.widget.WidgetProvider}
- and that works fine!!

There is even another way to get a ComponentName - by context and a string.
Which one should be used where and when??

Thanks!

Answer

The ComponentName constructor taking two Strings can be used to refer to a component in another application. But, the first argument is not the package name of the class; it is the package name of the application---the package attribute of the manifest element in that application's AndroidManifest.xml. So your first example should be

ComponentName cn = new ComponentName("de.zordid.sampleapp",
    "de.zordid.sampleapp.widget.WidgetProvider");

That constructor could certainly be used to refer to components in your own application, but since you already have hold of a Context from your own application you might as well use it and use one of the other constructors. In my opinion, the one taking a Class should be preferred whenever usable. You could use the one taking a String if you only know the class dynamically for some reason; in that case, it should take the fully-qualified class name as above.