2011-12-28 77 views
0

我是Android編程的相對新手(我主要在Windows上執行C#)。我繼承了一些由服務和應用程序組成的代碼。我想在另一個應用中重複使用該服務和一些應用。我把它放在一個圖書館裏。除了一個問題,一切都進展順利。該服務有一些代碼將主要活動放在屏幕上。它通過名字叫出這個活動。顯然,我不能用普通的代碼。該服務代碼看起來像這樣:在Android應用程序中分離邏輯和GUI。服務有應用程序的知識,不應該

final int NOTIFY_1 = 0x1001; 
NotificationManager notifier = (NotificationManager) context.getSystemService(
        Context.NOTIFICATION_SERVICE); 

final Notification notify = new Notification(
      R.drawable.icon_my_color, ticker, System.currentTimeMillis()); 

notify.number = 1; 
notify.flags |= Notification.FLAG_AUTO_CANCEL | Notification.FLAG_SHOW_LIGHTS; 
notify.ledARGB = android.graphics.Color.CYAN; 
notify.ledOnMS = 500; 
notify.ledOffMS = 500; 

Intent toLaunch = new Intent(context, MyBankingActivity.class); 
toLaunch.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
PendingIntent intentBack = PendingIntent.getActivity(context, 0, toLaunch, PendingIntent.FLAG_CANCEL_CURRENT); 

notify.setLatestEventInfo(context, title, message, intentBack); 
notifier.notify(NOTIFY_1, notify); 

當有趣的事情發生時(銀行帳戶變爲負值或某物),此代碼將由服務運行。問題是上面硬編碼的「MyBankingActivity.class」。我從庫中刪除了MyBankingActivity,因爲它是特定於應用程序的。不過,我必須讓舊應用程序工作。我只是希望它被分離成一個庫和應用程序,所以我可以在另一個應用程序中重用庫中相當多的邏輯。在另一個應用程序中,我不特別想要通知這個「銀行事件」 。即使我這樣做了,代碼當前也是用一個活動的名稱進行硬編碼的。

什麼是在這裏分開邏輯的正確方法?似乎該服務應該「發佈」該事件,而感興趣的應用程序應該「訂閱」。至少這是我熟悉的術語。順便說一下,現在,我剛剛註釋掉了整個代碼塊,並且在舊應用程序中一切正常,除了獲得此通知外。

我知道(道歉),我的問題是廣泛的。因爲「教一個人釣魚,而不是給他釣魚」可能會更好,請隨意推薦更廣泛地涵蓋此主題的參考資料/文章/書籍。我試圖單獨看看自己有限的圖書館,但是無論我的書籍是否過於介紹(Android in Action是one)還是我正在尋找錯誤的地方。即使建立圖書館和寫作服務的主題似乎也很難實現。在我看來,有我弱的幾個關鍵概念: 1.如何做一個服務通信事件有興趣沒有應用 2.如何能在應用被帶到基於前景的知識應用從服務收到的一些消息 3.如何獲取現有的應用程序並打入庫(適用於非GUI或非特定於應用程序的應用程序)和應用程序。 4通知如何工作....

提前許多感謝, 戴夫

+0

'notify'是一個java關鍵字,不應該用作變量名稱 – NikkyD 2011-12-28 18:16:00

+0

是的,嘗試使用_notify,如果你不想改變你的var的約定iables。 – 2011-12-28 18:25:17

回答

2

這似乎是服務應該是「出版」的事件,和應用程序,有興趣應該「訂閱」 。

該服務發佈的情況下,給用戶。

什麼是這裏的邏輯分離的正確方法?

這取決於你如何定義「正確」的。在這種情況下,我可能會通過PendingIntentNotification一起使用,作爲用於啓動服務的Intent的額外補充。 PendingIntent執行Parcelable,因此很好地進入Intent額外。通過這種方式,客戶指定當用戶點擊Notification時發生的情況 - 所有Service需要做的是在相關時顯示Notification

如何做一個服務通信事件有興趣沒有應用

這是不相關的這裏提出你的使用情況的瞭解應用程序。您沒有將某項服務的活動傳達給應用。您正在將服務中的事件傳達給用戶。用戶不是應用程序。這就是說,你可以發送廣播,或者讓客戶端傳遞一些額外的Intent作爲回調機制(例如,PendingIntent,Messenger)。

如何應用程序被帶到基於一些消息前景從服務

的服務調用startActivity()好評。請注意,如果用戶覺得你很討厭這樣做(例如,在遊戲過程中彈出一個活動),他們可能會以你不會感激的方式發泄他們的挫敗感。

您目前採取的方法 - 顯示Notification - 在大多數情況下是正確的。

如何利用現有的應用程序,並打入庫(對於非GUI或非特定應用程式的東西)

這不能抽象地回答,因爲任何操作系統值得一提。

通知如何運作.....

被覆蓋in the documentation,最入門的Android的書籍。

1

這與Intent有關,因爲它是實際啓動其他活動的代碼行。

你有一個

Intent toLaunch = new Intent(context, MyBankingActivity.class); 

這會告訴系統「我想要做一些與命名活動:......」 由筆者已經給意圖的名字告訴你會發生什麼。

意圖然後接收了幾個標誌

Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP 

(長話短說),他們確保活動被帶到前面,如果它仍然是在後臺的某個地方運行(或者更精確地說,如果它在歷史堆棧上)。

然後來了的PendingIntent

PendingIntent intentBack = PendingIntent.getActivity(
    context, 0, toLaunch, PendingIntent.FLAG_CANCEL_CURRENT); 

我不是那麼熟悉的PendingIntent,但我認爲它不是這裏使用的正確方法。

至於你的問題: 1)你可以創建意圖和具有應用註冊一個監聽他們 2)這就是意圖做的事情,它告訴系統,使該活動的前景(或其他的東西你可與意圖的標誌) 3)設置依賴於應用程序/代碼

4)http://developer.android.com/reference/android/app/NotificationManager.html 那裏,你也應該找到的所有其他主題的信息

相關問題