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



我有2个活动,i)主要活动ii)收藏夹活动和非活动类无线电服务。两个活动都是相同的方法 - notifyShowBar(),它显示在showbar.xml@layout中定义的文本栏。

主要活动.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onResume() {
    super.onResume();
    notifyShowBar();
}
public void notifyShowBar() {
....
    textView.setText(revs.getMeta());
....
}
.....

收藏夹活动.java

public class FavoriteActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onResume() {
    super.onResume();
    notifyShowBar();
}
public void notifyShowBar() {
....
    textView.setText(revs.getMeta());
....
}
.....

现在,当一个活动调用RadioService时,它会创建一个计时器任务,然后定期从服务器获取信息,并在父活动中显示栏。因此,该栏每 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();
    }
    }
.....
}

问题是,如果我在调用无线电服务的 MainActivity 中执行一个按钮,它会定期显示栏并在那里更新。但是当我浏览到收藏夹活动时,它会显示栏,但不定期更新。我怎样才能同时实现这两项活动?谢谢。

这可以通过简单的继承规则来完成。使用抽象方法创建abstract BaseActivity notifyShowBar扩展AppCompatActivity。使用 MainActivity & FavoriteActivity 作为 BaseActivity 的子类。由于抽象规则,notifyShowBar方法必须在MainActivity&FavoriteActivity中实现,所以每当你在BaseActivity中调用notifyShowBar时,它都会在子类中调用相同的<</p>

div class="one_answers">

使用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更安全的方式来执行此操作。

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

最新更新