2017-04-12 71 views
1

爲了通知用戶我使用AlertDialog或Snanckbar。他們都需要一個活動上下文才能顯示。三種情況:從當前活動產生用戶通知需要上下文

  • 信息:這是從另一個線程產生微不足道
  • 消息:我在執行廣播/接收器圖案,使得線程可以廣播消息和活動接收和顯示消息從關閉活性,例如酶活性萬事達開始活動選擇器產生
  • 消息時,用戶選擇一個選項,該代碼做一些東西,然後返回到主

    // Selector activity draft sample 
    mButtonSeelcted.setOnClickListener(new OnClickListener() { 
    @Override 
        public void onClick(View view) { 
        super.onClick(view); 
        doMagicForSelected(); 
        mContext.sendBroadcast(intentForUserMessage); 
        mContext.startActivity(intentToMasterActivity); 
        } 
    }); 
    

現在不顯示消息,因爲在接收器啓動時,Selector活動已完成。此外,它提供了一個WindowLeaked異常,因爲AlertDialog從未被解僱。

有什麼想法?有沒有我失蹤的模式?

回答

1

我實現廣播/接收器圖案,使得線程可以廣播消息和活動接收和顯示消息

請使用一個進程消息總線(例如,LocalBroadcastManager, greenrobot的EventBus)。使用系統廣播不僅會浪費CPU和電池,還會引入安全問題(例如,任何應用程序都可以監視您的消息)。

是否有我缺少的模式?

在第三種情況下,「主要活動」負責顯示此信息,而不是正在銷燬的活動。因此,將信息添加到您傳遞給startActivity()Intent,該信息告訴「主要活動」顯示該信息。

+0

感謝您的性能/安全提示:) 如果doMagicGorSelected方法獲得可以廣播給用戶的一個exeption(例如網絡問題),那麼它將廣播該消息。這種方法不知道主人。 我想我的觀點是,我應該如何處理這樣一個事實:上下文是不穩定的,並且在我使用它時可以被銷燬/更改。 – denispyr

+0

@denispyr:「我想我的觀點是,我應該如何處理這樣一個事實:上下文是不穩定的,可以在我使用它時被銷燬/更改」 - 如果主人是顯示對話框或快餐欄的人,那麼沒有波動性,所以我不理解這個問題。 – CommonsWare

+0

讓我澄清。關於我的草稿代碼,如果'doMagicForSelected()獲得「可顯示」異常(例如錯誤輸入),它將廣播該消息。選擇器活動將接收它並顯示一個對話框。如果這在onLoadFinished期間發生,那麼沒有問題,對話框將顯示。如果它在活動結束之前發生,那麼我會陷入困境。這種情況下是否存在一種模式? – denispyr

1
  1. 使用startActivityForResult從萬事達活性(活性的)啓動選擇活性(活性B)()。
  2. 根據結果顯示主對話框的對話框。