我有2项活动,i) MainActivity ii) FavoriteActivity 和非活动类 RadioService 。两个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());
....
}
.....
现在,当一个活动调用RadioService时,它会创建一个timertask,然后定期从服务器获取信息,并在父活动中显示bar。因此,条形图每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中执行一个调用RadioService的按钮,它会显示bar并定期更新。但是当我浏览到FavoriteActivity时,它会显示条形但不会定期更新。我怎样才能让这两项活动都成功?感谢。
答案 0 :(得分:5)
可以使用简单的继承规则来完成。
使用扩展abstract BaseActivity
的抽象方法notifyShowBar
创建AppCompatActivity
。
使用MainActivity
&amp; FavoriteActivity
作为BaseActivity
的子类。
由于抽象规则,notifyShowBar
方法必须在MainActivity
&amp; FavoriteActivity
,所以每当您在notifyShowBar
中致电BaseActivity
时,它都会在子类中调用相同的内容
答案 1 :(得分:1)
使用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。
答案 2 :(得分:0)
对于我的应用程序的类似问题,我使用的服务与活动+ Square's Otto bus无关。服务将各种事件发布到总线中,活动订阅此总线实例和事件类型并执行相应的操作。