我正在查看一些 lint 错误,并注意到有两种方法可以转换活动。
根据我从各种互联网资源中了解到的信息,我一直在为清单中的每个活动分配一个带有动作名称的意图过滤器,然后调用它以进行该活动。
然而,这给了我:“导出的活动不需要权限”lint 错误。有人说这可能是一个奇怪的问题,最好通过引用活动类来(使用 startActivity() 方法)。通过调用活动的类而不是意图过滤器。
谁能证明哪种方式更好?然而,似乎不提示 lint 错误的方式会是更好的方式......
谢谢!
我正在查看一些 lint 错误,并注意到有两种方法可以转换活动。
根据我从各种互联网资源中了解到的信息,我一直在为清单中的每个活动分配一个带有动作名称的意图过滤器,然后调用它以进行该活动。
然而,这给了我:“导出的活动不需要权限”lint 错误。有人说这可能是一个奇怪的问题,最好通过引用活动类来(使用 startActivity() 方法)。通过调用活动的类而不是意图过滤器。
谁能证明哪种方式更好?然而,似乎不提示 lint 错误的方式会是更好的方式......
谢谢!
推荐的方法是清单中Activity
不应包含已注册的<intent-filter>
部分,除非它旨在供外部应用程序使用。这方面的一个例子是使用类似Intent
action的东西查看特定的文档 mime 类型ACTION_VIEW
。这基本上是一个隐含的Intent
动作。
如果您的Activity
类仅供您自己的应用程序组件在内部使用,那么它们应该只能使用 expiclit 启动Intents
...
Intent myIntent = new Intent(this, MyActivity.class);
在这种情况下,应用程序组件启动Activity
“知道”它想要做什么并启动一个特定Activity
的去做。
另一种方法是使用 BroadcastReceiver 来处理意图。它将反过来开始您的活动。从广播接收器执行 startActivity()。因此,您在广播接收器上使用过滤器获取意图,但随后广播接收器将使用 startActivity 启动相应的活动。因此,在这种情况下,它确实是一种组合,但需要您广播意图而不是通过类名来定位它。如果您的应用程序很简单,您可以从另一个活动中开始活动(意图)。但不要在 Activity 上注册过滤器。我知道这个答案不是大众最喜欢的,但它被称为松散耦合,或关注点分离或其他东西。