【问题标题】:How to re-open (or resume) previously launched activity from a url link (deep link)?如何从 url 链接(深层链接)重新打开(或恢复)之前启动的活动?
【发布时间】:2015-12-28 20:41:42
【问题描述】:

我正在使用深层链接打开我的应用,这是意图过滤器:

        <intent-filter>
            <data android:scheme="http" />
            <data android:scheme="https" />
            <data android:host="myapp.delivery" />
            <data android:pathPattern="/.*" />

            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
        </intent-filter>

我们的用例是:

  1. 用户打开应用,浏览一些餐厅
  2. 用户点击餐厅(使用餐厅菜单打开 MenuActivity 活动)
  3. 用户单击菜单类别,例如比萨饼、甜点或汤,这将打开 CategoryActivity。
  4. 用户单击要添加到购物车的菜我需要向用户发送带有 url 的电子邮件。

我的问题:

(在第 4 步之后)用户单击电子邮件应用程序(比如 gmail 或收件箱应用程序)上的 url,这会提示用户打开我的应用程序或浏览器,如下所示:

当用户点击打开我的应用程序时,会发生 GotEmailActivity 在 gmail 应用程序之上打开的情况,我需要它在我之前打开的应用程序实例之上打开。

正如您在此处看到的,我的应用程序的 2 个实例已打开(第一个应用程序实例和第二个实例在 gmail 之上打开),:

如何在我之前启动的应用中打开点击的链接,而不是在 gmail/inbox 应用之上?

【问题讨论】:

  • 您想在清单中修改android:launchModeactivity doc
  • @zec 遗憾的是它不起作用它打开一个新的活动实例,它不在我的应用程序之上,而是作为它自己的堆栈中的一个独立活动,我尝试使用 android:launchMode 的 singleTask 和 singleInstance 属性
  • @zec 也尝试了 singleTop 似乎涵盖了这个用例,但我认为它只适用于从应用程序内部启动活动而不是深层链接:(,无论如何感谢您的回答!

标签: android android-intent android-activity android-manifest android-lifecycle


【解决方案1】:

答案我发现工作

所以我创建了在 gmail/inbox 应用程序之上启动的 EntryActivity:

public class EntryActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.entry_activity);

        Uri uriParams = getIntent().getData();

        Log.e("EntryActivity", uriParams.getHost() );
        Log.e("EntryActivity", uriParams.getQueryParameter("uid") + " " + uriParams.getQueryParameter("type") + " " + uriParams.getQueryParameter("token") );


        Intent startCategory = new Intent(this, GotEmailActivity.class);
        startCategory.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(startCategory);
        this.finish();
    }

}

现在发生的情况是,EntryActivity 在 Gmail 应用程序上打开,但它在中间关闭,但首先启动已打开的 GotEmailActivity,因此属性 launchMode Singletop 阻止此类活动的新实例。

然后,当我的应用在 GotEmailActivity 中打开时,我会向用户发送电子邮件,其中包含打开应用的链接,而 GotEmailActivity 在 AndroidManifest 中具有属性 android:launchMode="singleTop",因此仅打开了 1 个实例:

    <!-- 
        Important: notice android:launchMode="singleTop"
        which seeks if an instance of this activity is already opened and
        resumes already opened instance, if not it opens new instance.
     -->
    <activity
        android:name=".presenters.register.email.GotEmailActivity"
        android:label="@string/title_activity_got_email"
        android:launchMode="singleTop" 
        android:theme="@android:style/Theme.Translucent.NoTitleBar" >

答谢至:https://stackoverflow.com/a/34499615/5297353

【讨论】:

  • 对某些人来说可能被认为是 hacky,但对我来说,这个问题的确切解决方案。我想知道为什么没有赞成票。
【解决方案2】:

在 AndroidManifest.xml 中设置此代码

android:launchMode="singleTask"

在标签活动中

<activity
        android:name=".ui.live.liveinfo.LiveInfoActivity"
        android:clearTaskOnLaunch="true"
        android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboardHidden"
        android:launchMode="singleTask"
        android:parentActivityName=".ui.main.MainActivity"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.BROWSABLE" />
            <category android:name="android.intent.category.DEFAULT" />

            <data
                android:host="playpod.ir"
                android:pathPrefix="/lives/live"
                android:scheme="https" />
        </intent-filter>
    </activity>

【讨论】:

  • 对导航导航图很有用
猜你喜欢
  • 2019-08-26
  • 2021-06-08
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 2017-07-05
  • 2016-10-21
  • 1970-01-01
  • 2020-07-23
相关资源
最近更新 更多