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。 使用MainActivityFavoriteActivity 作为BaseActivity 的子类。 由于由于抽象规则,notifyShowBar 方法必须在MainActivityFavoriteActivity 中实现,所以每当你在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:定期更新来自同一数据源的两个活动文本的主要内容,如果未能解决你的问题,请参考以下文章

如何使用来自 Activity 的数据更新小部件?

Android-启动模式task-lunchmodle-intent flag 总结

android笔记5——同一个Activity中Fragment的切换

android 中怎么改变EditText控件中的提示信息(在同一ACTIVITY中)

从 Activity 更新 Android 小部件

与来自服务的活动(LocalService)通信 - Android 最佳实践