2011-03-30 72 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

相關問題