2012-09-28 93 views
0

我有一個服務的隱式意圖,將信息發送到我的主要活動以及另一個類。我現在也想要這個意圖啓動我的主要活動。我查看了與此相關的無數帖子,並在清單中嘗試了很多不同的東西 - addCategory,setAction(MAIN; the activity's name; you name it, I've tried it...),category.DEFAULT,以及其他一些導致ActivityNotFoundExceptions(最常見)或行爲的其他情況,這些情況在其他情況下是不受歡迎的。啓動服務中隱含意圖的主要活動

以下是設置意圖的位置和清單的相關部分。意圖的接收者註冊在主要活動中。

final String NEW_DOSES = "changed to protect the innocent"; 
Intent bluetoothBroadcast = new Intent(); 
several putExtra lines here 
bluetoothBroadcast.setAction(NEW_DOSES); 
sendBroadcast(bluetoothBroadcast); 

<activity 
    android:name=".AsthmaAppActivity" 
    android:label="@string/app_name" > 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 

是否有可能通過相對較小的變化來啓動我的主要活動?提前致謝。

+0

這不是好的做法,開始的'Activity'從'Service'除非它也作爲用戶直接採取的行動。一個'Service'是一個背景組件,而一個'Activity'是一個UI組件 - 當一個用戶不期待它時,迫使一個UI出現對用戶體驗不利。 – Squonk

+0

謝謝,是的,這是一個好點,我打算在我的問題中提到它。雖然我知道這樣做通常不是很好的做法,但我們仍然希望應用以這種方式「在用戶面前」。 – hBrent

+0

你能描述一下「Intent」附加功能是什麼以及它們會多久改變一次?當'Activity'已經打開時,可能可以使用廣播'Intent'的組合,當'Activity'從'Service'強制啓動時可以使用'STICKY'Intent。 – Squonk

回答

1

是的,它是可能的,但沒有與sendBroadcast(bluetoothBroadcast); sendBroadcast不會啓動一項活動。您必須使用startActivity來實現此目的。例如這裏是一個啓動應用程序會爲了做啓動應用程序:

public static void LaunchApplication(Context cx, String packagename) { 
    PackageManager pm = cx.getPackageManager(); 
    Intent i = pm.getLaunchIntentForPackage(ai.packageName); 
    if (i != null) cx.startActivity(i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); 
} 

您可以輕鬆地調整和演員,以啓動活動所需要的數據。例如,如果你的活動被命名爲myActivity那麼你可以去這樣的:

Intent i = new Intent(cx, myActivity.class); 
//Put the extras and the data you want here... 
//If you are launching the activity from a receiver component you must use 
//i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
cx.startActivity(i); 

希望這有助於...

+0

我嘗試了上面的建議,但由於接收器在活動中使用的方式,活動不再執行所需的操作。我當然可以在活動中更改代碼,以便在startActivity調用它時執行我所需的操作,但我希望不必這樣做。我現在不記得了,但我認爲使用startActivity也意味着其他類的接收者沒有收到它的意圖。 – hBrent

+1

如果您的主要活動必須是某些操作的接收者,並且也是您的應用程序的主要入口點,那麼您必須像這樣編寫代碼。我的意思是,如果它不執行所需的操作,則無法啓動主要活動。也許你應該考慮爲你的接收器和主要活動使用不同的組件。 最重要的是,我不能認爲一個「正確」的方式來通過sendBroadcast啓動一個活動,並將相同的Intent廣播到活動內部的接收器(如果我得到這個權利)... – Christos

+0

我不確定我是否理解了什麼你的意思是當你說,「如果它不執行所需的操作,你不能啓動你的主要活動」,但似乎我將不得不使用startActivity來啓動我的活動。我想我必須使用sendBroadcast作爲需要接收意圖的其他類,並使用startActivity啓動主要活動。不過,我認爲我不需要兩個單獨的意圖。謝謝你的幫助。 – hBrent