Android Activity :定期更新来自同一数据源的两个 activity 文本

Android Activity : Periodically updates both activity text from same data source

我有 2 个活动,i) MainActivity ii)FavoriteActivity 和一个非activity class 无线电服务。两者 Activity 都有相同的方法 - notifyShowBar(),它显示在 showbar.xml@layout 中定义的文本栏。

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

@Override
protected void onResume() {
    super.onResume();
    notifyShowBar();
}
public void notifyShowBar() {
....
    textView.setText(revs.getMeta());
....
}
.....

FavoriteActivity.java

public class FavoriteActivity extends AppCompatActivity implements View.OnClickListener {

@Override
protected void onResume() {
    super.onResume();
    notifyShowBar();
}
public void notifyShowBar() {
....
    textView.setText(revs.getMeta());
....
}
.....

现在,当 activity 调用 RadioService 时,它​​会创建一个定时器任务,然后定期从服务器获取信息,并在父 activity 中显示栏。因此,该栏每 15 秒显示一次更新信息。

private class ProgressTask extends AsyncTask<String, Void, Boolean> {

    @Override
    protected void onPostExecute(final Boolean success) {
            updateMeta();
            ....
    }

    public void updateMeta() {
    timerAsync = new Timer();
    timerTaskAsync = new TimerTask() {
        @Override
        public void run() {
                ((Activity)context).runOnUiThread(new Runnable() {
                @Override public void run() {
                    // get and set meta data here and then call createShowBar
                    createShowBar();
                }
            });
        }
    };
    timerAsync.schedule(timerTaskAsync, 0, 15000);
    }

    private void createShowBar() {
    if (RadioService.inwhich == 2) {
        ((FavoriteActivity) context).notifyShowBar();
    } else {
        ((MainActivity) context).notifyShowBar();
    }
    }
.....
}

问题是,如果我在调用 RadioService 的 MainActivity 中执行一个按钮,它会显示栏并定期更新。但是当我浏览到 FavoriteActivity 时,它显示栏但不定期更新。我怎样才能让这两个 activity 都发生?谢谢。

使用 BroadcastReceiver。您可以使用意图过滤器注册一个,然后它将接收使用 sendBroadcast 发送的意图。如果您只想在应用程序可见时更新,请注册接收器 onStart 并注销 onStop.

public class FavoriteActivity extends AppCompatActivity {
    private static final String ACTION_UPDATE = "Something unique";

    private static final IntentFilter FILTER = new IntentFilter(ACTION_UPDATE);

    private final BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // do your thing
        }
    };

    @Override
    protected void onStart() {
        super.onStart();
        registerReceiver(receiver, FILTER);
    }

    @Override
    protected void onStop() {
        super.onStop();
        unregisterReceiver(receiver);
    }
}

发送广播

Intent intent = new Intent(ACTION_UPDATE);
// add data to intent
sendBroadcast(intent);

此外,请查看 LocalBroadcastManager 更安全的方法。

这可以通过简单的继承规则来完成。 使用扩展 AppCompatActivity 的抽象方法 notifyShowBar 创建 abstract BaseActivity。 使用 MainActivityFavoriteActivity 作为 BaseActivity 的 child 类。 由于抽象规则,notifyShowBar 方法必须在 MainActivityFavoriteActivity 中实现,因此每当您在 BaseActivity 中调用 notifyShowBar 时,它都会在 child 类

中调用相同的内容

对于我的应用程序的类似问题,我使用了独立于活动的服务 + Square's Otto bus。服务将各种事件发布到总线中,活动订阅此总线实例和事件类型并执行相应的操作。