Android Service知識梳理
1040
2022-05-28
一、系統通知的注冊與響應
① 監聽應用進入后臺的通知
現有如下需求:程序編譯運行后,當按下設備的 home 鍵,程序進入后臺的同時會在控制臺中輸出相關信息。
程序進入后臺時除了會執行 AppDelegate.swift 里的 applicationDidEnterBackground 方法外,還會發送 UIApplicationDidEnterBackground 通知,這里可以使用 NotificationCenter 的 Rx 擴展方法來監聽這個通知。
關于 .takeUntil(self.rx.deallocated):它的作用是保證頁面銷毀的時候自動移除通知注冊,避免內存浪費或出現奔潰。
// 監聽應用進入后臺通知 _ = NotificationCenter.default.rx .notification(NSNotification.Name.UIApplicationDidEnterBackground) .takeUntil(self.rx.deallocated) // 頁面銷毀自動移除通知監聽 .subscribe(onNext: { _ in print("程序進入到后臺") })
1
2
3
4
5
6
7
運行結果:
程序進入到后臺
1
② 監聽鍵盤的通知
分別監聽虛擬鍵盤的打開和關閉通知,并在控制臺中輸出相關信息:
// 添加文本輸入框 let textField = UITextField(frame: CGRect(x:20, y:100, width:200, height:30)) textField.borderStyle = .roundedRect textField.returnKeyType = .done self.view.addSubview(textField) // 點擊鍵盤上的完成按鈕后,收起鍵盤 textField.rx.controlEvent(.editingDidEndOnExit) .subscribe(onNext: { _ in // 收起鍵盤 textField.resignFirstResponder() }) .disposed(by: disposeBag) // 監聽鍵盤彈出通知 _ = NotificationCenter.default.rx .notification(NSNotification.Name.UIKeyboardWillShow) .takeUntil(self.rx.deallocated) // 頁面銷毀自動移除通知監聽 .subscribe(onNext: { _ in print("鍵盤出現") }) // 監聽鍵盤隱藏通知 _ = NotificationCenter.default.rx .notification(NSNotification.Name.UIKeyboardWillHide) .takeUntil(self.rx.deallocated) // 頁面銷毀自動移除通知監聽 .subscribe(onNext: { _ in print("鍵盤消失") })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
二、自定義通知的發送與接收
定義一個 MyObserver.swift(觀察者在收到通知后的執行的處理函數中,添加了個 3 秒的等待),如下:
class MyObserver: NSObject { var name:String = "" init(name:String){ super.init() self.name = name // 接收通知: let notificationName = Notification.Name(rawValue: "DownloadImageNotification") _ = NotificationCenter.default.rx .notification(notificationName) .takeUntil(self.rx.deallocated) // 頁面銷毀自動移除通知監聽 .subscribe(onNext: { notification in // 獲取通知數據 let userInfo = notification.userInfo as! [String: AnyObject] let value1 = userInfo["value1"] as! String let value2 = userInfo["value2"] as! Int print("\(name) 獲取到通知,用戶數據是[\(value1),\(value2)]") // 等待3秒 sleep(3) print("\(name) 執行完畢") }) } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
發出一個攜帶有自定義數據的通知,同時創建兩個觀察者來接收這個通知:
let observers = [MyObserver(name: "觀察器1"),MyObserver(name: "觀察器2")] print("發送通知") let notificationName = Notification.Name(rawValue: "DownloadImageNotification") NotificationCenter.default.post(name: notificationName, object: self, userInfo: ["value1":"Kody", "value2" : 123]) print("通知完畢")
1
2
3
4
5
6
7
運行結果如下,可以看出,通知發送后的執行是同步的,也就是說觀察者全部處理完畢后,主線程才繼續往下進行:
發送通知 觀察器1 獲取到通知,用戶數據是[Kody,123] 觀察器1 執行完畢 觀察器2 獲取到通知,用戶數據是[Kody,123] 觀察器2 執行完畢 通知完畢
1
2
3
4
5
6
控制臺
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。