我有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>
使用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 总线的服务。该服务将各种事件发布到总线中,活动订阅此总线实例和事件类型并执行相应的操作。