2012-03-22 107 views
2

我正在製作一個Android應用程序插件。我試圖使其儘可能通用,這對我來說是一個問題。我正在設計插件,以便我製作的任何未來應用都可以輕鬆實現插件。我擁有的問題是插件包含一項服務,該服務會定期通過通知提醒用戶。當用戶打開通知欄並觸摸通知時,需要打開最初啓動服務的活動。如何確定哪個活動啓動了一項服務?

該服務使用此代碼開始:

startService(new Intent(this, myService.class)); 

以及服務啓動使用此代碼通知:

Intent notificationIntent = new Intent(this, myClass.class); 

目前,myClass.class是硬編碼到通知。這意味着無論我製作多少個不同的應用程序,如果使用此插件,我必須始終命名啓動服務「myClass」的類。

我想要一種通用的方式來獲得啓動服務的原始活動。

回答

2

好吧,我理解了它。我不確定這是否有點「黑客」,但在發佈原始問題之前我不知道的是,您可以創建一個通用意圖,然後使用包和類的路徑字符串設置類信息。這是我使用的代碼的副本。

在活動啓動服務,其實之前啓動服務:

serviceIntent.putExtra("PackagePath",this.getPackageName()); 
    serviceIntent.putExtra("ClassPath", this.getPackageName() + "." + this.getLocalClassName()); 

,服務在onStart事件中:

packagePath = intent.getExtras().getString("PackagePath"); 
    classPath = intent.getExtras().getString("ClassPath"); 

最後建立在服務的通知時:

Intent notificationIntent = new Intent(); 
    notificationIntent.setClassName(packagePath, classPath); 

這兩個包含什麼的例子特林變量:

packagePath = "myApp.main" 
    classPath = "myApp.main.mainActivity" 

特別感謝CommonsWare指着我使用Parceables的道路上,因爲尋找如何通過意圖傳遞Parceable例子給我帶來

3

我想通用的方式來獲得啓動服務的原始活動。

把你需要的信息在IntentIntent演員與startService()使用。服務無法確定啓動它的活動,很大程度上是因爲服務不必由活動啓動...

+0

那麼,如何把一個類的演員?我知道如何做字符串,整數等等,但是沒有選擇通過一個類作爲額外的選項。 – 2012-03-22 14:56:11

+0

@LucasBailey:一堂課對你來說毫無用處。您指出涉及多個應用程序,並且您的服務不能有其他項目的'Class'對象。最好的答案是讓你通過一個額外的'PendingIntent'傳遞給'Notification',所以客戶端活動可以做出關於標誌等的決定,這可能對它很重要。一個'PendingIntent'是'Parcelable',所以它可以進入額外的'Intent'。 – CommonsWare 2012-03-22 15:00:54

+0

這就是通知服務的工作原理。你必須告訴它當用戶選擇你的通知時啓動哪個類,像這樣... Intent notificationIntent = new Intent(this,someActivity.class);我會考慮傳遞一個未決的意圖。不知道爲什麼我沒有想到它。 – 2012-03-22 15:04:06

0

試試這個代碼,

if(this instanceof Activity1) { 
    //is Acitivty 1 
} 
else if (this instanceof Acitivity2){ 
    //is Activity2 
} 
+0

這不需要我每次更新我的插件時都會產生新的靈活性嗎? – 2012-03-22 15:01:35

相關問題