Android实现外部唤起应用跳转指定页面的方法实现外部唤起应用跳转指定页面的方法
主要给大家介绍了关于Android实现外部唤起应用跳转指定页面的相关资料,文中通过示例代码介绍的非常详
细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
前言前言
通常有这么一个场景,就是分享内容到微信朋友圈等,然后点击内容中的某个按钮就可以唤起自家应用。
这里要讲的也是使用 scheme 的方式去实现跳转,先捋一捋思路,首先如果要外部能唤醒 App ,那么 App 肯定要先注册一个
全局的事件监听吧。然后,应该有一个页面来处理接受事件然后解析出具体的参数然后跳转具体的页面。就是这么简单。
思路捋好来,那么就来一一实现吧。
注册事件监听注册事件监听
这里需要使用到 Android Activity中的 <intent-filter> ,现在可以创建一个解析跳转的 Activity,名字随便取了,然后需要在
Manifest 文件中配置具体的 <intent-filter>。
<intent-filter>
<data
android:scheme="test"
android:host="lovejjfg.com"
/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
如上配置,现在这个 Activity 就具备外部唤醒的能力了,注意下 <data> 中的相关配置,如上配置,外部的链接形式应该就是
这样的了:test://lovejjfg.com/xxx 。<data> 里面还可以定义其他内容,这里就不展开说了。
页面跳转页面跳转
咳咳,这里要注意下了,比如说你有一个启动页 A,主页是 B,现在要跳到指定的 C 页面。那么外部唤起 App 的时候,其实
有几种情况,这都是需要我们去考虑的。
先决考虑,这个看产品的需求了,那就是打开具体的页面,是仅启动该页面,回退直接返回浏览器,还是需要启动 App。如
果就是仅仅打开页面就行,那么很简单,直接跳转页面就好,不用考虑新建任务栈什么情况。如果回退要启动目标App,不然
用户直接回到浏览器,这里就要再区分几种情况了。
第一种情况,就是当前手机中并没有启动过目标 App。
简单说就是浏览器要直接跳到 C 页面,然后回退的时候,是显示 A 页面,然后进入 B 页面。这里就是需要我们自己去创建一
个堆栈,把 A、C 按顺序都放进去,所以 C 回退到 A,A 然后可以启动 B。知识点就是 TaskStackBuilder ,配合它的就是在
Manifest 中可以指定 Parent 的属性。
Activity 逻辑父项的类名称。此处的名称必须与为相应 元素的 android:name 属性指定的类名称一致。系统会读取
该属性,以确定当用户按下操作栏中的“向上”按钮时应该启动哪一个 Activity。 系统还可以利用这些信息通
过 TaskStackBuilder 合成 Activity 的返回栈。
要支持 API 级别 4 - 16,您还可以使用为 "android.support.PARENT_ACTIVITY"
指定值的 元素来声明父 Activity。
所以这里就看你的适配情况了。接下来看看这个 TaskStackBuilder 的使用,其实并不难,抄抄就会了。哈哈。详细的参照 官
方文档 只是这里说的是 PendingIntent 的开启方式,我们这里其实是直接 startActivity() 的方法,这个要怎么操作呢?
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(resultIntent.getComponent());
stackBuilder.addNextIntent(resultIntent);
stackBuilder.startActivities();
其实我一开始是不知道直接开启 Activity 需要怎么操作,因为抄的那里没有这么写,没有抄的就自己去看看方法咯。一开始我
是看到了 stackBuilder.getIntents() 的方法,然后机智的我赶紧试了下,调用context.startActivities() 果然有效果,后面才发现人家
builder 直接就有开启Activity 的方法,没错就是上面的写法。
等等,Builder 怎么被我写成这样了?这不是在侮辱Builder模式吗?
TaskStackBuilder.create(this)
.addParentStack(resultIntent.getComponent())
.addNextIntent(resultIntent)
.startActivities();