2011-03-30 73 views
13

我的项目主要是一个web应用程序。现在我有一个带有主屏幕小部件的android应用程序,并希望在内置浏览器中打开一些用户操作的网页。这很容易。在MyAppWidgetProvider.onUpdate我创建了一个新的意图:在android浏览器中打开一个url,避免多个标签

Intent intent = new Intent("android.intent.action.VIEW", 
    Uri.parse("http://my.example.com/")); 
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 
views.setOnClickPendingIntent(R.id.text, pendingIntent); 

不幸的是,新的浏览器窗口/标签打开每次用户点击小工具的时间。我的页面包含一些花哨的AJAX/JavaScript在后台运行,并定期发送http请求。所以我最终有8个选项卡包含相同的页面,并不断发送8倍数量的http请求。

有没有什么办法,例如不同的动作或额外的参数,以避免打开新的标签?

作为一种解决方法,我现在正在考虑创建一个包含WebView的新活动,但希望避免这种复杂性。

回答

18

是的,这是可能的。 使用http://developer.android.com/reference/android/provider/Browser.html#EXTRA_APPLICATION_ID可确保为您的应用程序重复使用相同的浏览器选项卡。例如:

Context context = widget.getContext(); 
Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName()); 
+0

谢谢!从API级别3(Android 1.5)开始,EXTRA_APPLICATION_ID甚至已经可用! – geekQ 2012-10-23 12:06:48

+1

'getPackageName()'部分只适用于我的情况(平板电脑Android 4.1.1)。它确实使用相同的标签启动浏览器,但按下BACK,浏览器不会返回上一页,只是完成它。通过[this](http://stackoverflow.com/questions/9902225/browser-extra-application-id-do-not-work-in-the-tablet-do-you-know-other-work-a/9917548 #9917548),它的作品! – Yeung 2014-05-20 08:50:07

+0

完美工作。我用intent.putExtra(Browser.EXTRA_APPLICATION_ID,getApplicationContext()。getPackageName()); – zappullae 2017-01-31 14:38:51

-1

据我所知,没有办法指定是否使用Intent打开新选项卡。我甚至做了一些看,无论如何找不到哪些标签打开。 您可以尝试的另一件事是跟踪用户最近是否已从您的应用程序发送到浏览器活动,并检查浏览器是否仍然打开,但我可以通过多种方式再次看到这种错误。

你的活动想法可能是这种情况下最好的赌注之一,但我可以理解你为什么要避免这种情况。

+0

“您总是可以结束浏览器的进程,并且应该关闭所有的选项卡,但我怀疑这是理想的解决方案。” - 这是不可能的,除非他的应用程序是以根用户身份运行的话。 – CommonsWare 2011-03-30 18:43:59

+0

不可能?完成一项任务肯定是可能的,否则将会有如此多的任务杀手?现在我只是试了一下,当我重新启动浏览器时它打开了相同的标签,所以_that_部分可能不起作用,但是您可以完成任务。 – 2011-03-30 18:48:07

+0

对不起,任务杀手在Android 2.1之后被粉碎了。进程无法在较新版本的Android上终止其他进程。 – CommonsWare 2011-03-30 19:04:30

相关问题