4

好吧,從Android庫項目中調用應用程序活動

所以我正在製作一個UI元素的庫項目。圖書館有一些基於ActionBarSherlock的活動,它是android中操作欄的向後兼容性庫。在這些活動中,我希望在操作欄中有一個按鈕,無論用戶在庫項目中使用哪個活動,都可以將用戶帶回家。

一些術語。 '庫'是指我正在開發的Android UI庫項目。 '應用程序'是指開發人員可能使用的庫中包含的任何客戶。

通常,當你做一個活動,你想打電話給另一個,你會做這樣的事情。

intent = new Intent(this, WhateverMyActivityName.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent); 

夠簡單。但這是棘手的問題。 Android庫幾乎不知道應用程序正在使用它們。所以'WhateverMyActivityName.class'是沒用的,因爲沒有辦法預測開發者應用程序會調用他們的活動。

我需要的東西來代替

intent = new Intent(this, WhateverMyActivityName.class); 

這樣

intent = new Intent(this, getApplication().MainActivity().getClass()); 

或者可能使用某種意圖的行動,它將調用的主要活動在應用(Intent.ACTION_MAIN or Intent.CATEGORY_LAUNCHER)

所以在簡而言之:我如何從圖書館項目獲得應用程序主要活動?

+0

剛剛在Intent文檔中發現了這一點 ACTION_MAIN與類別CATEGORY_HOME - 啓動主屏幕。 – OVERTONE

+0

這是一件很奇怪的事情..通常我們創建庫項目,以便我們可以重複使用它們的許多應用程序..獨立於應用程序代碼去那裏..調用一個庫項目中的特定應用程序活動限制了它的使用.. – Krishnabhadra

+0

@Krishnabhadra它是一個不尋常的用例,但圖書館的設計有一個主頁按鈕,我不能想出任何方法來阻止圖書館出血進入應用程序。也許我應該將它配置爲XML資源,以便開發人員可以指定他們想要調用的活動? – OVERTONE

回答

2

應用程序調用庫中的某些方法,提供要調用的Intent或提供要調用的活動Class。你的圖書館存儲在某個地方並使用它。

您認爲正確答案是「Intent.ACTION_MAIN或Intent.CATEGORY_LAUNCHER」的假設可能不準確。例如,有些應用程序將其作爲啓動畫面活動(這本身就是一個問題,但這並不重要),而且這不是應用程序內的家庭可供性應該去的地方。

+0

也許(考慮到它是一個庫,可能需要一些配置)我可以讓開發人員將他們的類定義爲一個xml資源。然後打電話給那個意圖? – OVERTONE

+0

@OVERTONE:我想這可以工作。就我個人而言,我真的建議你只是讓開發人員提供你使用的'Intent',因爲他們可能希望對標誌等具有一些控制權。 – CommonsWare

+0

讓他們提供意圖。這聽起來更清潔。如果他們願意,我也可以讓他們禁用它。下一個任務是找到一個乾淨的方式來做到這一點。任何建議? – OVERTONE

0

您可以使用this帖子中提到的代碼獲取活動列表。之後,通過resolveinfo循環,並檢查intenet過濾器,以找到所需意向操作的活動。

+0

也許我誤解了,但是這種方法不需要應用程序的包名稱嗎?在這種情況下,我仍然需要找到開發者應用程序的包名稱。 – OVERTONE

+0

@OVERTONE:由於您有開發者應用程序中的'Context'(這就是您所調用的'startActivity()'),您可以調用'Context'上的'getPackageName()'來查找應用程序的包名。 – CommonsWare

+0

你在那裏有上下文,從那裏你可以得到包管理器並完成其他事情。 –

9

我們可以使用反射來獲取類對象。

的Class.forName( 「com.mypackage.myMainActivity」)

添加在庫項目來調用這個代碼,

try { 
     Intent myIntent = new Intent(this,Class.forName("com.mypackage.myMainActivity")); 
     startActivity(myIntent); 
} catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
} 

「com.mypackage.myMainActivity」 是活動出現在主項目,我們需要從其庫項目調用。

+1

精湛的答案.. –

+1

這花了我幾天的時間來弄清楚。非常感謝,這是爲我工作的唯一解決方案。 – zeeshan

相關問題