我正在尝试在我的应用中实现深层链接。我有两个活动:SplashScreenActivity和MainActivity。两个活动都具有相同的意图过滤器,例如:
<activity
android:name="com.example.MainActivity" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data
android:host="product"
android:scheme="gg" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
<activity
android:name="com.example.SplashScreenActivity" >
<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:host="product"
android:scheme="gg" />
</intent-filter>
</activity>
我所做的是:当app已经打开时,我希望触发MainActivity,当app未打开时,我想要触发splashScreenActivity。但是出现了一个弹出窗口并希望我选择其中一个活动,我不希望这样。我想让它自动选择。那么,我该如何实现呢?
由于
答案 0 :(得分:3)
你面对预期的行为。如果您有两个活动处理相同的意图,您将面对选择器对话框。
从MainActivity中移除Intent-filter
,然后添加android:launchMode=singleTask
:
<activity
android:name="com.gittigidiyormobil.MainActivity"
android:launchMode=singleTask>
</activity>
<activity
android:name="com.gittigidiyormobil.SplashScreenActivity" >
<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:host="product"
android:scheme="gg" />
</intent-filter>
</activity>
只需通过SplashScreenActivity将Intent
发布到MainActivity,并在Intent
和onNewEvent
函数中处理onCreate
。 more about launchMode
希望它有所帮助。
答案 1 :(得分:3)
- &GT;首先,您不希望有多个选项来选择意味着您只想要一个选项。因此,您应该只有一个Activity
来处理此类事件。
即:如下所述,您应该在清单文件中有DeepLinkingActivity
。
<activity
android:name="com.example.DeepLinkingActivity" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data
android:host="product"
android:scheme="gg" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
<activity
android:name="com.example.MainActivity" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name="com.example.SplashScreenActivity" >
<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" />
</intent-filter>
</activity>
- &GT;您希望根据某些条件决定下一个流程,例如您的应用是否在前台,所以只需将该逻辑放在DeepLinkingActivity
中,并确保不设置任何布局文件对于那项活动。
即:
private boolean isAppInForeground(Context ctx) {
ActivityManager activityManager = (ActivityManager) ctx.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> services = activityManager.getRunningTasks(Integer.MAX_VALUE);
if (services == null) {
return false;
}
if (services.size() > 0 && services.get(0).topActivity.getPackageName().toString().equalsIgnoreCase(ctx.getApplicationContext().getPackageName().toString())) {
return true;
}
return false;
}
根据以上逻辑,您可以将用户重定向到SplashScreenActivity
或MainActivity
。
注意:强>
由于您要检索当前正在进行的任务,您需要在清单文件中添加以下权限。
<uses-permission android:name="android.permission.GET_TASKS" />
答案 2 :(得分:0)
在您的情况下,您使用Launcher和Default作为问题的单个活动(SplashScreenActivity)。根据您的需要,首先检查应用程序是否打开。如果应用程序在此SplashScreenActivity中的setcontentview方法之前打开,则启动mainActivity。如果应用程序未打开启动SplashScreenActivity。希望这会对你有所帮助:)。