Android Activity:定期更新来自同一数据源的两个活动文本
Posted
技术标签:
【中文标题】Android Activity:定期更新来自同一数据源的两个活动文本【英文标题】:Android Activity : Periodically updates both activity text from same data source 【发布时间】:2016-09-23 09:18:51 【问题描述】:我有 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,然后定期从服务器获取信息,并在父活动中显示栏。因此,该栏每 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 的按钮,它会显示栏并定期更新。但是当我浏览到 FavoriteActivity 时,它会显示栏但不会定期更新。我怎样才能让这两项活动都发生?谢谢。
【问题讨论】:
【参考方案1】:这可以通过简单的继承规则来完成。
使用抽象方法 notifyShowBar
创建 abstract BaseActivity
,它扩展了 AppCompatActivity
。
使用MainActivity
和FavoriteActivity
作为BaseActivity
的子类。
由于由于抽象规则,notifyShowBar
方法必须在MainActivity
和FavoriteActivity
中实现,所以每当你在BaseActivity
中调用notifyShowBar
时,它都会在子类中调用相同的方法
【讨论】:
你能用基本活动代码解释一下吗?对不起我的新手英语。谢谢。 感谢您的粘贴。我试过了,它在每个活动中都像往常一样显示文本栏,但只更新它的创建位置。所以回到原来的问题。例如,如果我从喜爱活动创建此无线电服务,它只会定期更新喜爱活动,而不是主活动页面。这是我的代码更新版本:pastebin.com/JmNthAkp 它没有更新,因为 favoriteactivity 和 mainactivity 在内存中有不同的引用。尝试在 BaseActivity 中创建 radionservice。所以 radioService 对象可以在 favoriteactivity 和 mainactivity 中使用,因为它们是 BaseActivity 的子类【参考方案2】:使用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,以更安全的方式执行此操作。
【讨论】:
感谢您的建议。用户也可以从 FavoriteActivity 初始化 RadioService!然后 RadioService 创建一个 timertask 并开始定期更新 FavoriteActivity 上的 bar。所以没有定期更新 MainActivity。反之亦然。怎么办? 广播是一种即发即弃的事情。你发送一个,有人可能会收到它,如果他们在听的话。您可以让两个活动都听,其中之一或都不听。【参考方案3】:对于我的应用程序的类似问题,我使用了独立于活动的服务 + Square's Otto bus。 Service 将各种事件发布到 Bus 中,Activity 订阅此总线实例和事件类型并执行相应的操作。
【讨论】:
以上是关于Android Activity:定期更新来自同一数据源的两个活动文本的主要内容,如果未能解决你的问题,请参考以下文章
Android-启动模式task-lunchmodle-intent flag 总结
android笔记5——同一个Activity中Fragment的切换