Android O - 混淆了隐含意图和显式意图的定义

时间:2017-08-23 09:18:06

标签: android android-intent

基本上,区分隐性和显式意图是显而易见的

  

明确意图指定了一个组件(通过   setComponent(ComponentName)或setClass(Context,Class)),其中   提供要运行的确切类。通常这些不包括任何   其他信息,只是一种应用程序启动的方式   当用户与之交互时,它具有的各种内部活动   应用

     

隐含意图尚未指定组件;相反,他们必须   包括足够的信息,以便系统确定哪个   可用组件最适合该意图运行。

但我对谷歌在https://developer.android.com/about/versions/oreo/background.html#broadcasts

上的介绍感到困惑
  

例如, ACTION_PACKAGE_REPLACED 是隐式广播,因为   它被发送给所有注册的听众,让他们知道一些   设备上的包装被更换了。然而,    ACTION_MY_PACKAGE_REPLACED 不是隐式广播,因为它是   只发送给已更换软件包的应用程序,无论多少   其他应用程序已为该广播注册了听众。

为什么 ACTION_MY_PACKAGE_REPLACED 不是隐式广播?

2 个答案:

答案 0 :(得分:2)

$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $lastyear = date('Y-m-d', strtotime("-1 year")); $order = $objectManager->create('Magento\Sales\Model\Order')->getCollection()->addAttributeToFilter('customer_id', $customer_id)->addAttributeToFilter('state', 'complete')->addAttributeToFilter('created_at', ['gteq' => $lastyear]); 是仅针对您的应用程序广播的意图,因为它仅在您的应用程序被替换时触发。这使它成为一个明确的Intent,因此不受android O的限制。

但是,每当更换软件包时,ACTION_MY_PACKAGE_REPLACED都会发送到每个应用程序,因此它不是特定于您的应用程序的。这使得它是一个隐含的Intent,并且在android O的新背景规则下被禁止使用。

答案 1 :(得分:0)

  

为什么ACTION_MY_PACKAGE_REPLACED不是隐式广播?

因为这就是Google编写发送ACTION_MY_PACKAGE_REPLACED广播的代码的方式。他们创建一个明确的Intent,标识接收广播的特定接收者。它们还附加动作字符串,以防接收器碰巧接收多个广播并且需要区分彼此。欢迎使用明确的Intent来获取操作字符串。隐式Intents之间的区别在于Intent是否标识组件。