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
。
使用 MainActivity
和 FavoriteActivity
作为 BaseActivity
的 child 类。
由于抽象规则,notifyShowBar
方法必须在 MainActivity
和 FavoriteActivity
中实现,因此每当您在 BaseActivity
中调用 notifyShowBar
时,它都会在 child 类
中调用相同的内容
对于我的应用程序的类似问题,我使用了独立于活动的服务 + Square's Otto bus。服务将各种事件发布到总线中,活动订阅此总线实例和事件类型并执行相应的操作。
我有 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
。
使用 MainActivity
和 FavoriteActivity
作为 BaseActivity
的 child 类。
由于抽象规则,notifyShowBar
方法必须在 MainActivity
和 FavoriteActivity
中实现,因此每当您在 BaseActivity
中调用 notifyShowBar
时,它都会在 child 类
对于我的应用程序的类似问题,我使用了独立于活动的服务 + Square's Otto bus。服务将各种事件发布到总线中,活动订阅此总线实例和事件类型并执行相应的操作。