ディープリンクによってアプリが既に開かれている場合、ディープリンクは機能しません。
ただし、アプリアイコンをクリックしてアプリを開くなど、ディープリンクをトリガーしないでアプリを開く場合。その後、ディープリンクを後でトリガーすると常に機能します。
詳細は次のとおりです。
AndroidManifestでは、LaunchActivityというアクティビティをこのように設定しています。
<activity
Android:name="some.package.name.LaunchActivity"
Android:screenOrientation="portrait"
Android:theme="@style/Theme.SomeTheme">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action Android:name="Android.intent.action.VIEW" />
<category Android:name="Android.intent.category.DEFAULT" />
<category Android:name="Android.intent.category.BROWSABLE" />
<data Android:scheme="dlscheme" Android:Host="dlhost" />
</intent-filter>
</activity>
また、LaunchActivityでは、onCreate()でログを出力して、そこにあったことを示します。
私は使った
adb Shell am start -W -a Android.intent.action.VIEW -d "dlscheme://dlhost/param" some.package.name
ディープリンクをテストします。
アプリを終了した状態で、上記のコマンドを使用しました。アプリを開いて正しいアクティビティにルーティングすることができます。問題ありません。そして、次のログがあります。
adb Shell am start -W -a Android.intent.action.VIEW -d "dlscheme://dlhost/param" some.package.name
Starting: Intent { act=Android.intent.action.VIEW dat=dlscheme://dlhost/param pkg=some.package.name }
Status: ok
Activity: some.package.name/.activity.LaunchActivity
ThisTime: 898
TotalTime: 898
WaitTime: 919
Complete
ただし、アプリを強制終了せずに同じコマンドを再度入力した場合。アプリを開くだけですが、正しいアクティビティは開かず、次のログが生成されます。
adb Shell am start -W -a Android.intent.action.VIEW -d "dlscheme://dlhost/param" some.package.name
Starting: Intent { act=Android.intent.action.VIEW dat=dlscheme://dlhost/param pkg=some.package.name }
Warning: Activity not started, its current task has been brought to the front
Status: ok
Activity: some.package.name/.activity.LaunchActivity
ThisTime: 0
TotalTime: 0
WaitTime: 6
Complete
この余分な行で
Warning: Activity not started, its current task has been brought to the front
私は実際にこれをウェブサイトでも試してみました、chromeインテント:
intent://dlhost/param#Intent;scheme=dlscheme;package=some.package.name;end
そしてそれは同じように振る舞います。
LaunchActivityアクティビティタグのマニフェストにAndroid:launchMode="singleTop"
を追加します
プロジェクトのマニフェストファイルで、メインアクティビティにフォローを追加する必要があります。
Android:launchMode="singleTask"
そのため、マニフェストには、次のようなものがあります。
<activity Android:name="some.package.name.LaunchActivity"
Android:launchMode="singleTask">
Android:screenOrientation="portrait"
Android:theme="@style/Theme.SomeTheme">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action Android:name="Android.intent.action.VIEW" />
<category Android:name="Android.intent.category.DEFAULT" />
<category Android:name="Android.intent.category.BROWSABLE" />
<data Android:scheme="dlscheme" Android:Host="dlhost" />
</intent-filter>
</activity>
基本的に、これは新しいタスクを作成し、新しいインスタンスがルートインスタンスとしてタスクにプッシュされます。ただし、アクティビティインスタンスがタスクに存在する場合、システムはonNewIntent()メソッド呼び出しを介してそのアクティビティインスタンスにインテントをルーティングします。このモードでは、アクティビティインスタンスを同じタスクにプッシュできます。また、ユーザーが現在のアクティビティから[戻る]キーをクリックすると、システムはユーザーを前のアクティビティに戻します。
一方、singleTop
では、アクティビティのインスタンスが現在のタスクの最上部に既に存在し、システムがこのアクティビティにインテントをルーティングしている場合、onNewIntent()メソッドを起動するため、新しいインスタンスは作成されません。新しいオブジェクトを作成する代わりに。
詳細については、 こちら をご覧ください。
Android:launchMode="singleTask"
動作します。 singleTop
はうまくいきませんでした。
プロジェクトのマニフェストファイルで、メインアクティビティにフォローを追加する必要があります。
_Android:launchMode="singleTask"
_
onNewIntent()
内のディープリンクを処理します
_@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recipe);
onNewIntent(getIntent());
}
protected void onNewIntent(Intent intent) {
String action = intent.getAction();
String data = intent.getDataString();
if (Intent.ACTION_VIEW.equals(action) && data != null) {
String recipeId = data.substring(data.lastIndexOf("/") + 1);
Uri contentUri = RecipeContentProvider.CONTENT_URI.buildUpon()
.appendPath(recipeId).build();
showRecipe(contentUri);
}
}
_
Mainefestファイルはこのサンプルのように見えます
<activity
Android:name=".user.HomeActivity"
Android:screenOrientation="portrait"
Android:exported="true"
Android:launchMode="singleTop"
Android:windowSoftInputMode="stateAlwaysHidden"
Android:theme="@style/AppTheme.NoActionBar" >
<intent-filter>
<action Android:name="Android.intent.action.VIEW" />
<category Android:name="Android.intent.category.DEFAULT" />
<category Android:name="Android.intent.category.BROWSABLE" />
<data Android:scheme="example"/>
<data Android:Host="example.com"
Android:pathPrefix="/deeplink"/>
<action Android:name="Android.intent.action.MAIN" />
</intent-filter>
</activity>
HomeActivity
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Uri data = intent.getData();
if (data != null)
callDeep(data);
setIntent(intent);
Log.d("DeepLinking", "new intent value==>" + data + "==== value===>");
}
//or in on create
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
Uri data = intent.getData();
Log.d("DeepLinking", "intent value==>" + data + "==== value===>" + bundle + "===action==>" + action);
}
「マニフェストにAndroid:launchMode = "singleTop"をアクティビティとともに追加します」
起動モードがデフォルトの場合、この警告は「警告:アクティビティが開始されていないため、現在のタスクが前面に表示されます」ということです。アクティビティの新しいインスタンスを作成するたびに新しいオブジェクトを作成する代わりに呼び出されます
ログから、「警告:アクティビティは開始されていません。現在のタスクは前面に移動されています」と言われているため、アクティビティの新しいインスタンスは作成されません。そのような場合、新しいインテントはアクティビティのonNewIntent(Intent intent)にリダイレクトされます。
あなたの場合、このメソッドをオーバーライドしていないと思われ、アクティビティのonCreate()メソッドから情報を抽出します。
代わりに、extractDataFromIntentAndProcess(Intent intent)のようなメソッドを作成し、oncreateメソッド(extractDataFromIntentAndProcess(getIntent()))およびアクティビティのonNewIntentメソッド(extractDataFromIntentAndProcess(intent))から呼び出します。