在我的模块中,在OSGI组件声明中我需要使用一个属性,该属性将在我的portal-ext.properties中,如下所示:
open class Foo
{
internal required init() // error
}
但是我得到了编译错误:“注释属性Component.property的值必须是常量表达式”。我该怎么办才能在这里使用房产?
答案 0 :(得分:2)
但是我得到了编译错误:"注释属性Component.property的值必须是常量表达式"。我该怎么办才能在这里使用房产?
条目:
@Component(configurationPid="foo")
是问题所在。这是因为注释只能具有编译时常量的值。显然,这个属性不是编译时常量,因为它的值取决于调用方法。
如果要在运行时提供属性值,则可以使用Configuration Admin在OSGi中执行此操作。默认情况下,所有声明性服务组件都是可配置的,使用pid:
@Component(name="bar")
@Activate
当您向Configuration Admin提供与DS组件的pid匹配的配置字典时,它将绑定到该组件。
@Modified
方法@Component(configurationPolicy=ConfigurationPolicy.REQUIRE)
方法,则这些更改将是动态的,否则您的组件实例将被停用并被丢弃,并且会创建并激活新实例。通过设置组件的配置策略,可以强制组件在激活配置之前不激活。当您拥有需要存在的属性但在运行时才能知道该属性时,这非常有用。
Intent[] intents = new Intent[2];
Intent intent1 = new Intent(this, MainActivity.class);
Intent intent2 = new Intent(this, YourActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivities(this, 0, intents,PendingIntent.FLAG_ONE_SHOT);
答案 1 :(得分:1)
您可以使用配置管理配置设置任何这些属性。 因此,一种方法是使用单独的组件为该组件编写配置。
您可以使用configurationPolicy = ConfigurationPolicy.REQUIRE
来阻止在此配置出现之前激活组件。
另一种方法是使用组件工厂。请参阅this blog from Scott。