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 開発者 Web サイトのアプリの設定でも宣言されています。

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 を搭載した Samsung Nexus でこの問題をテストしたところ、この結果になりましたが、Android 2.3.5 を搭載した Galaxy S1 でテストしたところ、当初の期待どおりに動作しました。

どんな助けでも大歓迎です、ありがとう。

4

3 に答える 3

9

Facebook は、「MainActivity」(開発者ページで提供されたもの) を明示的に開始することにより、独自のアプリからアプリを開始しています。

それによって-Androidのデフォルトの動作は次のとおりです。アプリケーションが既に実行されている場合、再度呼び出すと、startActivity()新しいタスクを最初から開始するのではなく、既に実行中のタスクをフォアグラウンドに復元するだけです。

しかし良いニュースは、MainActivity にandroid:launchMode="singleTask". その定義は次のとおりです。

システムは新しいタスクを作成し、新しいタスクのルートでアクティビティをインスタンス化します。ただし、アクティビティのインスタンスが別のタスクに既に存在する場合、システムは、新しいインスタンスを作成するのではなく、その onNewIntent() メソッドを呼び出すことによって、インテントを既存のインスタンスにルーティングします。一度に存在できるアクティビティのインスタンスは 1 つだけです。

この時点から、いつでも開始インテントに応答できます。その時点から、両方のフラグ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 を変更してください)、このインテント フィルターを定義するアクティビティにリンクが誘導されます。

于 2013-04-24T16:37:12.077 に答える