首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

将浏览器作为 Intent 打开,但不要将其保留在 Activity 堆栈中

浏览器作为Intent打开,但不要将其保留在Activity堆栈中。

在浏览器中打开一个链接,通常会使用Intent来启动一个Activity或Service。在Intent中,我们可以指定要打开的Activity或Service,以及要传递的参数。在打开链接之后,Activity或Service会开始执行,并且不会在Activity堆栈中保留。

在Android中,如果使用浏览器打开一个链接,并且想要在打开后仍然保持在当前Activity中,可以使用浏览器提供的API来实现。例如,可以使用WebView来加载一个网页,并在网页中指定一个回调函数,以便在网页加载完成后执行。在网页加载完成后,可以使用WebView的onPageFinished()方法来监听网页是否加载完成,并在网页加载完成后关闭当前Activity。

以下是一个使用WebView打开网页并保持在当前Activity中的示例代码:

代码语言:javascript
复制
// 创建一个WebView对象
WebView webView = findViewById(R.id.web_view);

// 设置WebView的URL
String url = "https://www.example.com";
webView.loadUrl(url);

// 在网页加载完成后关闭当前Activity
webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        // 在网页加载完成后关闭当前Activity
        finish();
    }
});

在这个示例代码中,我们首先创建了一个WebView对象,并指定了一个URL。然后,我们调用了WebView的loadUrl()方法来加载网页。最后,我们使用WebView的setWebViewClient()方法来设置一个WebViewClient对象,以便在网页加载完成后关闭当前Activity。

需要注意的是,在设置WebViewClient时,需要在其onPageFinished()方法中编写关闭当前Activity的代码,而不是在onPageStarted()方法中。因为在onPageStarted()方法中,页面还没有加载完成,而onPageFinished()方法则是在页面加载完成后调用的。

除了使用WebView之外,还可以使用Chrome Custom Tabs来打开网页,并保持在当前Activity中。Chrome Custom Tabs是一个第三方浏览器,它提供了与系统浏览器类似的体验,并且可以保持在当前Activity中。在使用Chrome Custom Tabs时,可以创建一个TabHost对象,并在其中添加一个ChromeClient对象,以便在网页加载完成后关闭当前Activity。

代码语言:kotlin
复制
val tabHost = findViewById<TabHost>(R.id.tab_host)
tabHost.setup()

val chromeClient = object : ChromeClient() {
    override fun onNewTab(tab: Tab) {
        // 在网页加载完成后关闭当前Activity
        val intent = Intent(this, MainActivity::class.java)
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        tab.intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        tabHost.addTab(tab)
        tabHost.currentTab = tab
        startActivity(intent)
    }
}

tabHost.chromeClient = chromeClient

在这个示例代码中,我们首先创建了一个TabHost对象,并。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

你真的了解Activity的启动模式吗?

" /> 当用户点击主屏幕应用图标打开应用时,如果该应用最近未曾被使用过,则会创建一个任务,并将该应用的入口Activity作为任务的根...进栈与出栈 当前 Activity 启动另一个 Activity 时,新的 Activity 会被推送到堆栈顶部,成为焦点显示在屏幕上。 前一个 Activity保留在堆栈,但是处于停止状态。...当所有 Activity 均从堆栈移除后,任务即不复存在。栈也就会被回收掉。 特殊的任务 通过前面的了解,我们知道如果打开新的界面需要把Activity实例放到当前任务对应的返回栈的栈顶。...例1:当来自多个不同任务的应用选择使用系统浏览器访问网页的时候,浏览器应用并不会在每个任务的返回栈中都创建Activity,而是所有网页以选项卡的形式展示在同一个界面。...即使在很长一段时间后,任务仍将所有 Activity 保留在堆栈

58740

Android面试官:这几个问题都回答不出来你真的懂Activity的启动模式吗?

" /> 当用户点击主屏幕应用图标打开应用时,如果该应用最近未曾被使用过,则会创建一个任务,并将该应用的入口Activity作为任务的根...进栈与出栈 当前 Activity 启动另一个 Activity 时,新的 Activity 会被推送到堆栈顶部,成为焦点显示在屏幕上。 前一个 Activity保留在堆栈,但是处于停止状态。...当所有 Activity 均从堆栈移除后,任务即不复存在。栈也就会被回收掉。 特殊的任务 通过前面的了解,我们知道如果打开新的界面需要把Activity实例放到当前任务对应的返回栈的栈顶。...例1:当来自多个不同任务的应用选择使用系统浏览器访问网页的时候,浏览器应用并不会在每个任务的返回栈中都创建Activity,而是所有网页以选项卡的形式展示在同一个界面。...即使在很长一段时间后,任务仍将所有 Activity 保留在堆栈

1.1K00

深入理解Activity启动模式之大结局

Intent.FLAG_ACTIVITY_NO_HISTORY   使用该模式来启动Activity,当该Activity启动其他Activity后,该Activity就被销毁了,不会保留在任务栈。...Intent.FLAG_ACTIVITY_NEW_TASK 该标志位表示使用一个新的Task来启动一个Activity,相当于在清单文件Activity指定“singleTask”启动模式。...指定 Activity 与任何任务均无亲和关系,请将其设置为空字符串。...taskAffinity影响Activity的任务(TASK)从属; 我们先来看看截取的一段堆栈信息: Running activities (most recent first):...该 Activity浏览器应用定义,但作为电子邮件任务的一部分启动。 如果将其父项更改为浏览器任务,它会在浏览器下一次转至前台时显示,当电子邮件任务再次转至前台时则会消失。

1.3K10

Android四大组件之Activity

} }2、 在清单文件为源文件声明Activity```js<span...名,B代表的是启动的activityIntent i=new Intent(A.this,B.class);//启动startActivity(i);2、 隐式启动( 可以启动别的软件的acitvity...)```jsAction代表的是你启动的activity的清单属性的actionIntent i=new Intent(“action”);startActivity(i);四、Activity 生存周期在任何周期里...(savedInstanceState);  setContentView(R.layout.activity_main); } //activity在用户可见状态,但不能被操作,可以做一些初始化操作/... 启动模式1、 Standard每次打开一次activity 就创建一个任务到堆栈里,意思就是A 打开B ,B 再打开A( 不是返回) ,此A 非彼A ,两个任务id 不一样,android 默认的启动方式

56730

【Android 应用开发】Android 返回堆栈管理 ( 默认启动模式 | 栈顶复用启动模式 | 栈内复用启动模式 | 单实例启动模式 | CLEAR_TOP 标识 )

栈内复用启动模式 ( singleTask ) ---- 独立任务 启动模式 ( singleTask ) : 跳转到 Activity X ; ① 发现 现有任务的 返回堆栈存在 Activity...Activity ; 使用场景 : 在自己的应用 , 启动第三方浏览器 或 播放器 , 那么这些第三方的应用界面 , 不应该加入到自己开发的任务栈 , 而是创建一个新任务 , 这些第三方的应用启动界面...: 在该 单实例启动模式 ( singleInstance ) 界面启动其它界面 , 都在其它的任务打开 , 本任务只能有这一个界面 ; AndroidMenifest.xml 设置方式 : <activity...FLAG_ACTIVITY_CLEAR_TOP 标识 : 跳转到 Activity X ; ① 存在该 Activity 实例 : 发现当前返回堆栈存在 Activity X 实例 , 会直接调用该...Activity X 实例 的 onNewIntent() 方法 , 跳转用的 Intent 转给栈顶的 Activity X 实例 , 不再创建新的界面入栈 , 同时会将返回堆栈内该 Activity

51810

Android实现外部唤起应用跳转指定页面的方法

注册事件监听 这里需要使用到 Android Activity的 <intent-filter ,现在可以创建一个解析跳转的 Activity,名字随便取了,然后需要在 Manifest 文件配置具体的...先决考虑,这个看产品的需求了,那就是打开具体的页面,是仅启动该页面,回退直接返回浏览器,还是需要启动 App。如果就是仅仅打开页面就行,那么很简单,直接跳转页面就好,不用考虑新建任务栈什么情况。...如果回退启动目标App,不然用户直接回到浏览器,这里就要再区分几种情况了。 第一种情况,就是当前手机并没有启动过目标 App。...简单说就是浏览器直接跳到 C 页面,然后回退的时候,是显示 A 页面,然后进入 B 页面。这里就是需要我们自己去创建一个堆栈,把 A、C 按顺序都放进去,所以 C 回退到 A,A 然后可以启动 B。...直接开启的时候记得要加上Intent.FLAG_ACTIVITY_NEW_TASK的Flag,不然就在浏览器所在的堆栈里面了。

3K10

政策更新 | 开发者如何处理软件包可见性

本文介绍适应此特性的最佳实践。 查询应用并与之交互 您可以通过以下几种方式查询应用并与之交互: 如果您知道想要查询或与之交互的特定应用集,请将其 软件包 名称包含在 元素内的一组 元素。... 如果您的应用需要查询或与一组具有特定用途的应用交互,但您可能不知道添加的具体软件包名称,您可以 intent 过滤器签名 列在您的 元素。... 如果您需要查询 Content Provider,但不知道具体的软件包名称,则可以在 元素声明该提供程序授权。...FLAG_ACTIVITY_REQUIRE_NON_BROWSER 只有 intent 解析为非浏览器结果时,此标记才会启动它。...如果此类结果不存在,抛出 ActivityNotFoundException,然后,您的应用可以在自定义标签页打开该网址。

44640

被后台杀死后,Android应用如何重新走闪屏逻辑

后台杀死与恢复的堆栈.jpg APP被后台杀死后,APP端进程被销毁了,也就不存在什么Activity了,也就没有什么Activity堆栈,不过AMS的却是被保留了下来: ?...,这样做的理由是为了清理之前的场景,不然之前的ActivityRecord栈仍然保留在ActivityManagerService,具体实现如下,放在BaseActivity中就可以: Intent...如果简单划分一下推送场景,可以看做一下三种 进程存活,Activity存活 进程存活,但是没有Activity存活 进程不存在(无论是否被杀) 其实后面两种完全可以看做一种,这个时候,都是先start...的路由系统,针对这两种场景,先跳转闪屏,闪屏回来后,再跳转推送页 如何判断呢,后面两种场景其实只需要判断是否有Activity存活即可,也就是查查APP的topActivity是否为null,注意不要去向...AMS查询,而是在本地进程查询,可以通过反射查询ActivityThread的mActivities,也可以根据自己维护的Activity堆栈来判断,判断没有存活Activity的前提下,就跳转主页面去路由

2.7K40

四大组件的纽带——Intent

启动 Activity Activity 表示应用的一个屏幕。通过 Intent 传递给 startActivity(),可以启动新的 Activity 实例。...在 Activity 的 onActivityResult() 回调Activity 结果作为单独的 Intent 对象接收。 2....通过 Intent 传递给 startService(),可以启动服务执行一次性操作(例如,下载文件)。Intent 描述了启动的服务,并携带了任何必要的数据。...> 在上述代运,标明了当前Activity可以响应的动作为“com.jinyu.cqkxzsxy.android.intent.action.xxx”,而标签则包含了一些类别信息...而隐式Intent的功能要比显示Intent更加强大,不仅可以开启本应用的组件,还可以开启其他应用的组件,例如打开系统自带的照相机、浏览器等。

1K50

Android 进阶2:Activity 的 Task 与启动模式

Task 是指在执行特定任务时与用户交互的一系列 Activity。 这些 Activity 按照各自的打开顺序排列在堆栈。...应用的 Task 名默认为包名,我们可以使用 taskAffinity 标签在 AndroidManifest.xml 中指定某个 Activity 属于的 Task 名称: <activity...如果应用 Task 不存在(应用最近未曾使用),则会创建一个新 Task,并且该应用的“主”Activity作为堆栈的根 Activity 打开。...正如我们的日常体验,用户通过按“Home” 键离开任务时,当前 Activity 停止且其 Task 会进入后台。 ? 系统保留 Task 每个 Activity 的状态。...使用,达到的效果就和 singleTask 差不多了,比如用于通知栏启动 Activity ,以达到 Activity 所在 Task 调到前台,同时 clearTop 的效果 FLAG_ACTIVITY_SINGLE_TOP

1.5K50

Android任务和返回栈完全解析,细数那些你所不知道的细节

这样,如果另外一个应用程序的某个Activity声明自己是可以响应这种Intent的,那么这个Activity就会被打开。...在当前场景下,这个Intent是为了发送邮件的,所以说邮件应用程序当中的编写邮件Activity就应该被打开。...再举一个例子,Android系统内置的浏览器程序声明自己浏览网页的Activity始终应该在一个独立的任务当中打开,也就是通过在元素设置"singleTask"启动模式来实现的。...这意味着,当你的程序准备去打开Android内置浏览器的时候,新打开Activity并不会放入到你当前的任务,而是会启动一个新的任务。...taskAffinity属性接收一个字符串参数,你可以指定成任意的值(经我测试字符串至少包含一个.),但必须不能和应用程序的包名相同,因为系统会使用包名来作为默认的affinity值。

1.4K70

大前端开发的路由管理之三:Android篇

当需要新建的Activity想要的任务栈(通过TaskAffinity指定)不存在,则先创建该任务栈,新建该Activity实例并将其置于栈顶;若该任务栈存在,判断该Activity是否存在于栈,若存在...,则将其之上的Activity实例全部出栈,使其置于栈顶,重用该Activity实例;否则新建该Activity将其置于栈顶。         ...新建一个任务栈B并新建该Activity实例并置于栈顶。当页面返回时,会返回并使用打开Activity之前的任务栈A,按照先进后出的顺序跳转进任务栈A的栈顶Activity。         ...Navigation和Flutter的路由有一定的相似性,这里是frament作为跳转点,在开发时,可以清晰地看到每个界面的跳转路径。...同时,Navigation 组件提供管理所有返回堆栈的功能,堆栈的顶部为当前屏幕,堆栈记录着访问的目的地顺序,堆栈的底部是应用的起始地,同时提供了相关更改返回栈的方法,使得我们可以灵活在不同Fragment

3.2K11

Android拾萃- Activity的生命周期和启动模式

当用户离开 Activity 并在 Activity 意外销毁时向其传递保存的 Bundle 对象时,系统会调用此方法。...Intent.FLAG_ACTIVITY_NO_HISTORY   使用该模式来启动Activity,当该Activity启动其他Activity后,该Activity就被销毁了,不会保留在任务栈。...如果e-mail应用切换到后台,浏览器在下次打开时由于allowTaskReparenting值为true,此时浏览器就会显示该activity而不显示浏览器主界面,同时actvity也将从e-mail...例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。聊天的对话窗口, singleTask适合作为程序入口点。例如浏览器的主界面。...不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。之前打开过的页面,打开之前的页面就ok,不再新建。

1.5K50

Android 组件化 —— 路由设计最佳实践

使用场景 App接收到一个通知,点击通知打开App的某个页面 浏览器App中点击某个链接打开App的某个页面 运营活动需求,动态把原生的页面替换成H5页面 打开页面需要某些条件,先验证完条件,再去打开那个页面...的onCreate手动调用get方法 参数定义在path,不利于多人协作 Apt依赖注入,但是手动调用get方法 手动调用 手动调用 结果返回 Rxjava回调 onActivityResult onActivityResult...转发 AndroidManifest注册,将其export=fasle,但是再通过DispatchActivity转发Intent,天猫就是这么做的,比上面的方法的好处是路由查找都是系统调用,省掉了维护路由表的过程...Module接入不同App,Scheme自动适应,路由表其实是Path---》Activity,这样的话内部跳转的时候ARouterUri是没有的。...> 这三种方法,比较适合的还是签名校验为主,adb过滤为副 如何解决路由造成的Activity堆栈错乱的问题 activity的launchMode使用不当会照成闪屏页面打开多次的问题

1.6K30

【建议收藏系列】:我打赌你一定没搞明白的Activity启动模式!

这样,如果另外一个应用程序的某个Activity声明自己是可以响应这种Intent的,那么这个Activity就会被打开。...正常情况下,当一个Activity启动了另一个Activity的时候,新启动的Activity就会置于任务栈的顶端,并处于活动状态,而启动它的Activity虽然成功身退,但依然保留在任务栈,处于停止状态...对于大部分应用,当我们在主界面点击回退按钮的时候都是退出应用,那么当我们第一次进入主界面之后,主界面位于栈底,以后不管我们打开了多少个Activity,只要我们再次回到主界面,都应该使用主界面Activity...在跨应用Intent传递时,如果系统不存在singleTask Activity的实例,那么创建一个新的Task,然后创建SingleTask Activity的实例,将其放入新的Task。...设置Intent的Flag 系统提供了两种方式来设置一个Activity的启动模式,除了在AndroidManifest文件设置以外,还可以通过Intent的Flag来设置一个Activity的启动模式

2.2K00

android学习笔记----启动模式与任务栈(Task)

: 启动模式 Default 实例化 是否启动新任务 是否允许在任务启动其他activity standard 是 每次创建intent时,都会创建一个新实例。...此外,实例可以是多个任务的成员,也可以是一个任务的多个实例。 否。在发起意图的同一任务打开 是 singleTop 否 与标准完全相同,但如果活动位于Task堆栈的顶部,则使用现有实例。 否。...实现向上导航,第一步是声明哪个活动是每个活动的适当父级。这样做允许系统便于导航模式,例如Up,因为系统可以从清单文件确定逻辑父活动。...然后父活动指定为android.support.PARENT_ACTIVITY的值,与android:parentActivityName属性匹配。...如果目标父活动位于任务的后台堆栈,则会将其提前。

37610

安卓 topic-意图 Intent

隐式 Intent :不会指定特定的组件,而是声明执行的常规操作,从而允许其他应用的组件来处理它。...(image-976dbc-1640352429584)] ,并将其传递给 startActivity()。[2]Android 系统搜索所有应用Intent 匹配的 Intent 过滤器。...** 找到匹配项之后,[3] 该系统通过调用匹配 ActivityActivity B)的 onCreate() 方法并将其传递给 Intent,以此启动匹配 Activity](http://upload-images.jianshu.io...如果用户可能希望今后一直使用相同的应用执行某项操作(例如,打开网页时,用户往往倾向于仅使用一种网络浏览器),则这一点十分有用。..., int)) 返回能够执行那些作为参数传递的 Intent 的所有 Activity 列表,而 [queryIntentServices()](http://developer.android.youdaxue.com

1.3K10
领券