2

に応答する必要がある 2 つのアクティビティを含むアプリケーションがありますandroid.intent.action.VIEW。それらはマニフェストのように定義されています

<activity android:name=".FirstActivity">
    <intent_filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:scheme="my_callback1"/>
    </intent_filter>
</activity>
<activity android:name=".SecondActivity">
    <intent_filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:scheme="my_callback2"/>
    </intent_filter>
</activity>

my_callback1デフォルトのブラウザ アクティビティによって起動されます。Twitterの認可コールバックなので多分こんな感じ

ブラウザは URL にリダイレクトされますmy_callback1://callback?token=0123456789abcdef

my_callback2Linkifyそのようなカスタムフィルターによって起動されます:

Linkify.addLinks(textView, pattern, null, matcher, new Linkify.TransformFilter() {
    @Override
    public String transformUrl(Matcher match, String url) {
    return "my_callback2://".concat(url);
    }
});

両方のコールバックが機能しておらず、IFandroid.intent.category.DEFAULTがインテント フィルターに追加されていません。いずれDEFAULTかのインテント フィルターに を追加すると、対応するコールバックが正常に動作し始めます。同時に両方に設定されていない場合 - コールバックは機能しません (私は受け取りますandroid.content.ActivityNotFoundException)

4

3 に答える 3

3

これに対する私の答えは、元の質問者にとっては少し遅れていますが、この特定の質問は答える価値があり、代わりに誤解されていました. また、Web ページからアプリのさまざまな部分へのリダイレクトを処理するために、複数のアクティビティを閲覧可能にすることにも苦労していました。これは Android では基本的にサポートされていません。これは、アクティビティを閲覧可能にするには、それをデフォルトにする必要があるためです。つまり、閲覧可能なアクティビティを複数持つことはできません。複数のアクティビティをブラウズ可能およびデフォルトとしてマークすると、URI のアンパック時にコンポーネント情報が無視されるため、正しく区別するインテント URI を作成できなくなります。

ただし、ブラウザーからインテントを取得するときにパラメーターを受け入れ、それらを使用して、最初に起動したかったアクティビティを新しい BrowsableActivity で起動することができます。ブラウザは、次のようなリンクにアクセスする必要があります。

<a href="intent:#Intent;component=my.app.package/.activity.BrowsableActivity;S.my.app.package.activity.BrowsableActivity.PARAMETER_NAME=activityName;end">

重要なのは、アプリの新しい BrowsableActivity を作成することです。次のように、そのアクティビティのみのインテント フィルターを BROWSABLE に設定します。

<activity android:name="BrowsableActivity">
    <intent_filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent_filter>
</activity>

次に、Activity のコードでパラメーターをアンパックします。

   @Override
   protected void onCreate(Bundle savedInstanceState) {
    Intent intent = getIntent()
    String otherActivityName = (String) intent.getSerializableExtra(PARAMETER_NAME);
    if (otherActivityName == firstOne) {
       // create an intent and launch the first activity
    } else {
      // create an intent and launch the other activity
    }
  }

これで、browsable アクティビティ内から必要なアクティビティを起動できます。必要に応じて、BrowsableActivity の意図からそれらをアンパックして他のアクティビティに渡すだけで、追加のパラメータをそのアクティビティに渡すこともできます。

于 2015-04-28T10:15:45.590 に答える
0

ブラウザは、起動する に を追加android.intent.category.BROWSABLEIntentます。したがって、インテント解決を機能させるには、フィルターにそのカテゴリを含める必要があります。

ドキュメントからIntentFilter

Intent のすべてのカテゴリがフィルターで指定されたカテゴリに一致する場合、カテゴリは一致します。Intent に含まれていないフィルター内の余分なカテゴリによって、一致が失敗することはありません。アクションとは異なり、カテゴリのない は、カテゴリを持たないIntentFilterのみに一致することに注意してください。Intent

于 2013-01-14T07:48:26.317 に答える