21

我正在尝试在我的应用程序上实现 Facebook 的深度链接功能并遇到以下情况:

我有一个名为 MainActivity 的活动,它的声明如下:

    <activity
        android:name="com.mypackage.android.MainActivity">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

此活动 + 我的包名称也在我的应用程序设置中声明在 facebook 开发者网站上。

在 Facebook 的应用程序上单击链接后,我应该通过我的活动的 onCreate 方法来处理此事件。以下代码处理该事件:

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Uri target = getIntent().getData();

        if (target != null){
          // got here via Facebook deep link
          // once I'm done parsing the URI and deciding
          // which part of my app I should point the client to
          // I fire an intent for a new activity and
          // call finish() the current activity (MainActivity)
        }else{
          // activity was created in a normal fashion
        }
    }

一切都按计划进行,除了以下情况:

  1. 用户启动了我的应用
  2. MainActivity 创建
  3. 次要活动已创建
  4. MainActivity 完成
  5. 应用程序通过设备主页按钮进入后台
  6. 深层链接在 Facebook 的应用程序上被点击

在这种情况下,我的应用程序再次进入前台,但 MainActivity 的 onCreate / onNewIntent 不会被调用,而是 SecondaryActivity 的 onResume() 被调用并恢复到它的最后状态。

注意:我已经在带有 Android 4.2.1 的三星 Nexus 上测试了这个问题并得到了这个结果,但在带有 Android 2.3.5 的 Galaxy S1 上测试时,它按我最初的预期工作。

任何帮助将不胜感激,谢谢。

4

3 回答 3

9

Facebook 通过显式启动您的“MainActivity”(您在开发人员页面中提供给他们的那个)从他们自己的应用程序启动您的应用程序。

这样 - Android 的默认行为是:如果应用程序已经运行,那么再次调用startActivity()不会从头开始新任务,而只会恢复到前台已经运行的任务。

但好消息是您可以通过向 MainActivity 添加android:launchMode="singleTask". 它的定义是:

系统创建一个新任务并在新任务的根目录下实例化活动。但是,如果活动的实例已经存在于单独的任务中,系统会通过调用其 onNewIntent() 方法将意图路由到现有实例,而不是创建新实例。一次只能存在一个活动实例。

从这一点开始,您始终可以响应起始意图,并且从那时起,您始终可以通过使用两个标志Intent.FLAG_ACTIVITY_SINGLE_TOP&&Intent.FLAG_ACTIVITY_CLEAR_TOP组合重新启动活动来导航回已经在后台的任务(如果存在)

于 2013-04-29T05:57:49.793 回答
1

请参阅http://developer.android.com/guide/topics/manifest/activity-element.html

你可以玩:

android:clearTaskOnLaunch
android:noHistory
android:launchMode
于 2013-04-28T17:23:57.113 回答
0

您需要在意图过滤器中包含更多信息:

<intent-filter>
   <action android:name="android.intent.action.VIEW"></action>
   <category android:name="android.intent.category.DEFAULT"></category>
   <category android:name="android.intent.category.BROWSABLE"></category>
   <data android:host="www.yoursite.com" android:scheme="http"></data>
</intent-filter>

这将捕获指向您网站的链接(确保更改 URL),并将它们定向到您在其下定义此意图过滤器的任何 Activity。

于 2013-04-24T16:37:12.077 回答