如何避免在Android上两次处理深层链接?

时间:2015-06-23 08:30:41

标签: android onresume deep-linking

我有一个Android测试应用程序,它在onResume中处理自定义URL深层链接(例如myapp:// xxx / yyy),如下所示:

if (intent.getAction() != Intent.ACTION_VIEW) return;
String data = intent.getDataString();
if (data == null) return;
// do stuff with 'data' which is the custom URL

问题是,每次应用程序恢复时,此代码会一次又一次地处理URL,即使它没有使用深层链接重新打开!让我们说我:

  1. 使用自定义网址运行应用程序
  2. 正确处理网址
  3. 我将应用再次移至后台
  4. 我像往常一样重新打开应用程序(不是通过深层链接,只需按下它的图标)
  5. 再次处理URL,因为getDataString()不断返回最后一个URL
  6. 如果我终止应用程序进程并定期启动它(而不是通过链接) - 只有这时getDataString()才会返回null并且URL处理停止。
  7. 根据一些建议,我将代码移动到onCreate()。这仍然反复运行,例如,即使应用程序仍处于前台,设备也会旋转。所以onCreate也不是一个好选择。

    如何避免在应用恢复时反复获取相同的网址?

3 个答案:

答案 0 :(得分:1)

根据上述评论,最佳解决方案似乎是:

  1. 将URL处理代码放在onCreate(state)
  2. 仅在州== null
  3. 时处理URL

    代码示例:

    void onCreate(Bundle savedInstanceState) {
        if (savedInstanceState == null) {
            if (intent.getAction() == Intent.ACTION_VIEW) {
                String data = intent.getDataString();
                if (data != null) {
                    // ... process URL in 'data'
                }
            }
        }
    }
    

答案 1 :(得分:0)

处理意图使用后 setIntent(NULL);

答案 2 :(得分:0)

我认为你应该处理OnNewIntentonCreate中的网址(当从后台变为活动时都不会被调用),为了避免在旋转时进行多次处理,我有两个解决方案:

解决方案1 ​​: 在onCreate中,如果savedInstanceState为空,则忽略它,此基于多次调用的解决方案来自轮换,只需要在应用端进行更改。

解决方案2 : 使深度链接网址动态,每次更改(如myapp://xxx/yyy?stamp=xxxx),您可以检查网址是否已经处理。此解决方案可以采用任何案例,但需要您修改URL(可能来自服务器端)。