Android BroadcastReceiver onReceive Update TextView in MainActivity

后端 未结 5 1910
说谎
说谎 2020-12-01 04:04

In MainActivity I have a TextView: textV1. I also have a method in MainActivity that updates that textview:

public void updateTheTextView(final String t) {
         


        
相关标签:
5条回答
  • 2020-12-01 04:18

    If someone is searching this exact solution, but in Kotlin, do the following:

    class MainActivity : AppCompatActivity() {
    
        companion object {
            var ins: MainActivity? = null
            fun getInstance(): MainActivity? {
                return ins
            }
        }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            ins = this
        }
    
        fun updateTheTextView(t: String) {
            this@MainActivity.runOnUiThread {
                val textV1 = findViewById<TextView>(R.id.textV1)
                textV1.text = t
            }
        }
    }
    
    class NotifAlarm : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            try {
                MainActivity.getInstance()?.updateTheTextView("The String")
            } catch (e: Exception) {
    
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-01 04:18

    In your broadcastreceiver class send broadcast

    public class mybroadcaster extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        context.sendBroadcast(new Intent("updatetext"));
      }
    }
    

    In your activity register your broadcastreceiver and call it, do your work at onReceive and unregister the broadcaster in onDestroy()

    public class MyActivity  extends Activity{
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        registerReceiver(broadcastReceiver, new IntentFilter("updatetext"));
    }
    
    BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // do your work here
        }
    };
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(broadcastReceiver);
      }
    }
    
    0 讨论(0)
  • 2020-12-01 04:33

    create an instance of the class and then pass the value to the function that changes TextView value follow these steps please : in your BroadcastReceiver overRide onReceive method and paste These lines or changes theme as you wish

    private Handler handler = new Handler(); // Handler used to execute code on the UI thread
    // 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();
        YourActivityToUpdate.updateTheTextView(message);
        YourActivityToUpdateinst = YourActivityToUpdate.instance();
            if(inst != null)  { // your activity can be seen, and you can update it's context
            inst.updateTheTextView(message);
            }
        }
    });
    

    now we explain the updateTheTextView and inst in YourActivityToUpdate class Paste these Lines please

    private static SignUpVerify mInst;
    
    public static SignUpVerify instance() {
            return mInst;
    }
    @Override
    public void onStart() {
        super.onStart();
        mInst = this;
    }
    
    @Override
    public void onStop() {
        super.onStop();
        mInst = null;
    }
    

    and this is the updateTheTextView method that should be placed in YourActivityToUpdate class

    public void updateTheTextView(final String verifyCodeValue) {
                    Log.i("verifyCodeValue", verifyCodeValue);
                    YourTextViewToUpdate.setText(verifyCodeValue);
        }
    

    i think this is a better way thanks to "kevin-lynx"

    0 讨论(0)
  • 2020-12-01 04:37

    #Use Interface Another way to deal with this situation is by using an Interface. I will describe the advantage of this approach but first, let's see how it's done.

    Follow these steps:
    1) Create an interface

    public interface MyBroadcastListener{
    
        public void doSomething(String result);
    
    }
    

    2) Initialize the listener in BroadCastReceiver

    public class NotifAlarm extends BroadcastReceiver {
    
        private MyBroadcastListener listener;
    
        @Override
        public void onReceive(Context context, Intent intent) {
           
            listener = (MyBroadcastListener)context;
    
            // other things done here like notification
    
            // NUPDATE TEXTV1 IN MAINACTIVITY HERE
            listener.doSomething("Some Result");
        }
    }
    

    3) Implement the interface in Activity and override the method

    public YourActivity extends AppCompatActivity implements MyBroadcastListener{
    
        // Your Activity code 
    
        public void updateTheTextView(String t) {
            TextView textV1 = (TextView) findViewById(R.id.textV1);
            textV1.setText(t);
        }
    
        @Override
        public void doSomething(String result){
             updateTheTextView(result);          // Calling method from Interface
        }
    
     }
    

    ##Advantages of using the interface?

    • When you have BroadcastReceiver in a different file
    • Decoupled BroadcastReceiver

    Using an interface makes BroadcastReceiver independent of any Activity. Let's say in future you want to use this BroadCastReceiver with another Activity which takes the result from BroadcastReceiver and start a DetailActivity. This is completely a different task but you will use the same BroadcastReceiver without even a single code change inside BroadcastReceiver.

    How to do that?
    Implement the interface in the Activity and Override the method. That's it!

    public ListActivity extends AppCompatActivity implements MyBroadcastListener{
    
        // Your Activity code 
    
        public void startDetailActivity(String title) {
            Intent i = new Intent(ListActivity,this, DetailActivity.class);
            i.putExtra("Title", title);
            startActivity(i);
        }
    
        @Override
        public void doSomething(String result){
             startDetailActivity(String title);    // Calling method from Interface
        }
    
     }
    
    0 讨论(0)
  • 2020-12-01 04:43

    In your MainActivity initialize a variable of MainActivity class like below.

    public class MainActivity extends Activity {
        private static MainActivity ins;
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ins = this;     
        }
    
        public static MainActivity  getInstace(){
            return ins;
        }
    
        public void updateTheTextView(final String t) {
            MainActivity.this.runOnUiThread(new Runnable() {
                public void run() {
                    TextView textV1 = (TextView) findViewById(R.id.textV1);
                    textV1.setText(t);
                }
            });
        }
    }
    
    
    public class NotifAlarm extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            try {
                MainActivity  .getInstace().updateTheTextView("String");
            } catch (Exception e) {
    
            }           
        }
    }
    
    0 讨论(0)
提交回复
热议问题