ブロードキャスト受信者(BroadcastReceiver)でUIをリフレッシュする方法

6477 ワード

学習android仲間は今日、自分が書いた放送受信者の中でuiを更新しようとした.
この問題は、進捗バーをトーストに変えてみんなができると信じて、onReceiveで直接判断すればいいのです
if (intent.getAction().equals("DELIVERY_MESS_ACTION")) {
            if (getResultCode() == -1) {
                Toast.makeText(context, "    ", 1).show();
            } else if (getResultCode() == 0) {
                Toast.makeText(context, "    ", 1).show();
            }
        }

しかし、私たちがしたいのはトーストだけではありません.どうすればいいですか.安卓中のメッセージ伝達メカニズム、つまりHandlerを考えた学生がいます.いいですね.これはできます.そして、それがrunOnUIThreadという方法です.
直接使用する場合、MainActivity.this.runOnUIThreadは""No enclosing instance of the type MainActivity is accessible in scope" "の問題を引き起こします.これはMainActivityが内部クラスではないため、どのように解決しますか?私たちは今ラジオでactivityのコンテキストを手に入れたいと思っています.これはこの問題の鍵です.activityは私たちのnewではないので、そうすることができます.
  • activityで静的クラスメンバー変数instance
  • を作成
  • onCreateメソッドの最後に、thisをinstance
  • に割り当てます.
  • 自分で静的メソッドgetInstance
  • を書く
  • ブロードキャストでactivityを得るコンテキストは
  • である.
    if (intent.getAction().equals("DELIVERY_MESS_ACTION")) {
                if (getResultCode() == -1) {
                    // Toast.makeText(context, "    ", 1).show();
                    MessSendActivity.getInstance().runOnUiThread(new Runnable() {
    
                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            // Toast.makeText(MessSendActivity.getInstance(),
                            // "from messSend", 1).show();
                            ProgressBar pb = (ProgressBar) MessSendActivity
                                    .getInstance().findViewById(R.id.pb);
                            pb.setVisibility(View.INVISIBLE);
                        }
                    });
                } else if (getResultCode() == 0) {
                    Toast.makeText(context, "    ", 1).show();
                }
            }

    添付:内部クラスを使用する場合、ブロードキャスト受信者をコードで登録すると、次のように実現できます.
    public class MainActivity extends Activity {
    
        private MyReceiver receiver;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            receiver = new MyReceiver(new Handler()); // Create the receiver
            registerReceiver(receiver, new IntentFilter("some.action")); // Register receiver
    
            sendBroadcast(new Intent("some.action")); // Send an example Intent
        }
    
        public static class MyReceiver extends BroadcastReceiver {
    
            private final Handler handler; // Handler used to execute code on the UI thread
    
            public MyReceiver(Handler handler) {
                this.handler = handler;
            }
    
            @Override
            public void onReceive(final Context context, Intent intent) {
                // Post the UI updating code to our Handler
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(context, "Toast from broadcast receiver", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        }
    }

    参考:ブロードキャスト受信者によるUIの更新
    参照:静的メソッドによるdialogの表示