何时在Android中使用ComponentName的构造函数?

我对Android中的ComponentName类有点困惑。

有不同的方法来获取组件名称对象,但我不知道何时使用哪个…以及为什么!

例:

  • 应用程序包是de.zordid.sampleapp
  • 但是widget提供程序类是de.zordid.sampleapp.widget.WidgetProvider

运用

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

我得到了这个组件信息: ComponentInfo{de.zordid.sampleapp.widget/WidgetProvider} ,但我无法使用它 – 组件未知! 但是JavaDoc说我应该给那个包中的包和类 – 这就是我做的,不是吗?

    运用

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

    产生ComponentInfo{de.zordid.sampleapp/de.zordid.sampleapp.widget.WidgetProvider} – 并且工作正常!!

    甚至还有另一种获取ComponentName的方法 – 通过上下文和字符串。 应该在何时何地使用哪一个?

    谢谢!

    Related of "何时在Android中使用ComponentName的构造函数?"

    采用两个StringComponentName构造函数可用于引用另一个应用程序中的组件。 但是,第一个参数不是类的包名; 它是应用程序的包名称—该应用程序的AndroidManifest.xml manifest元素的package属性。 所以你的第一个例子应该是

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

    该构造函数当然可以用于引用您自己的应用程序中的组件,但由于您已经拥有了自己的应用程序中的Context ,因此您可以使用它并使用其他构造函数之一。 在我看来,只要可以使用,就应该首选一个Class 。 如果你因某种原因只是动态地知道这个类,那么你可以使用一个String ; 在这种情况下,它应该采用上面的完全限定类名。

    或者你可以在BroadcastReceiver中使用这样的:

     ComponentName smsReceiver = new ComponentName(this, SMSReceiver.class); 

    罗伯特·图佩洛 – 施奈克的回答是关于优先选择反对弦乐的对象。 这就是我看到它的方式。

    • 要引用您自己的组件,请使用:

       new ComponentName(getApplicationContext(), WidgetProvider.class); 
    • 要在您自己的应用中引用一些动态引用的组件,请使用:

       // values/strings.xml: de.zordid.sampleapp.widget.WidgetProvider String fqcn = getResources().getString(R.string.provider); new ComponentName(getApplicationContext(), fqcn); 

      当您想要使用Android的资源限定符来决定使用哪个组件时,这非常有用,您可以覆盖values-*/strings.xml的默认字符串。

    • 要引用其他应用程序的组件,请使用:

       int componentFlags = GET_ACTIVITIES | GET_PROVIDERS | GET_RECEIVERS | GET_SERVICES; PackageInfo otherApp = context.getPackageManager().getPackageInfo("com.other.app", componentFlags); ComponentInfo info = otherApp.activities[i]; // or providers/receivers/... new ComponentName(info.packageName, info.name); 

    关于.Names和

    build.gradle

     android { defaultConfig { // this is what will be used when you upload it to the Play Store applicationId 'net.twisterrob.app' } buildTypes { debug { // The neatest trick ever! // Released application: net.twisterrob.app // IDE built debug application: net.twisterrob.app.debug // This will allow you to have your installed released version // and sideloaded debug application at the same time working independently. // All the ContentProvider authorities within a system must have a unique name // so using ${applicationId} as authority will result in having two different content providers. applicationIdSuffix '.debug' } } } 

    在所有合并打开的build\intermediates\manifests\full\debug\AndroidManifest.xml之后,查看最终清单的外观。