Android BroadcastReceiver onReceive Update TextView in MainActivity

在MainActivity中,我有一个TextView:textV1。我在MainActivity中还有一个更新该文本视图的方法:

public void updateTheTextView(final String t) {
    MainActivity.this.runOnUiThread(new Runnable() {
        public void run() {
            TextView textV1 = (TextView) findViewById(R.id.textV1);
            textV1.setText(t);
        }
    });
}

在 BroadcasrReceiver 中,我需要在 MainActivity 中更新 textV1 中的文本。

public class NotifAlarm extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
            // other things done here like notification

            // NEED TO UPDATE TEXTV1 IN MAINACTIVITY HERE
    }
}

如何做到这一点?广播接收机从服务运行。此代码我无法更改。我可以从 onReceive() 访问和更改 MainActivity 中的 textV1 吗?我尝试过很多事情,但都失败了。


答案 1

在初始化类的变量中,如下所示。MainActivityMainActivity

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) {

        }           
    }
}

答案 2

#Use接口 处理这种情况的另一种方法是使用接口。我将描述这种方法的优点,但首先,让我们看看它是如何完成的。

请按照以下步骤操作:
1) 创建接口

public interface MyBroadcastListener{

    public void doSomething(String result);

}

2) 在 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) 在 Activity 中实现接口并重写该方法

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?

  • 当您将广播接收器放在其他文件中时
  • 解耦广播接收器

使用接口使 BroadcastReceiver 独立于任何活动。假设将来您希望将此 BroadCastReceiver 与另一个活动一起使用,该活动从 BroadcastReceiver 获取结果并启动 DetailActivity。这是一个完全不同的任务,但您将使用相同的广播接收器,甚至无需在广播接收器中更改任何代码。

如何做到这一点?
在活动中实现接口并重写该方法。就是这样!

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
    }

 }

推荐