【问题标题】:How to notify Activity about changes in global variable in Application?如何通知 Activity 应用程序中全局变量的变化?
【发布时间】:2012-04-05 05:08:49
【问题描述】:

我有一个 IntentService 可以更新扩展应用程序类中的全局变量。在我的几个活动中,我需要知道变量何时更改。 我是否必须在我的所有活动中实现一个 BroadcastReceiver(并从我的服务发送一个意图),还是有更简单的方法来通知我的活动?

谢谢!

【问题讨论】:

  • BroadCast 接收器是要走的路..

标签: android notifications broadcastreceiver intentservice


【解决方案1】:

我也遇到过这类问题。解决方案之一中的广播接收器。但我对此并不满意。所以,我尝试了另一种方法。您可以在 andrdoid 中的对象观察者模式中找到更多详细信息,refer this link

public class TestActivity extends Activity implements Observer {
        BaseApp myBase;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            myBase = (BaseApp) getApplication();
            myBase.getObserver().addObserver(this);
            myBase.getObserver().setValue(10);

        }

        @Override
        public void update(Observable observable, Object data) {
            // This method is notified after data changes.

            Toast.makeText(this, "I am notified" + myBase.getObserver().getValue(),
                    0).show();
        }
    }



    public class Test extends Observable
    {

        private int value=2;

        /**
         * @return the value
         */
        public int getValue() 
        {
            return value;
        }

        /**
         * @param value
         *            the value to set
         */
        public void setValue(int value) 
        {
            this.value = value;
            setChanged();
            notifyObservers();
        }
    }

    package app.tabsample;

    import android.app.Application;

    public class BaseApp extends Application {
        Test mTest;

        @Override
        public void onCreate() {
            super.onCreate();

            mTest = new Test();
        }

        public Test getObserver() {
            return mTest;
        }

    }

【讨论】:

  • 有趣!这就是我的想法.....但是这是线程安全的吗?如果我从 IntensService(在另一个进程中运行)中设置值,那么活动中的更新函数在哪个线程中运行?请耐心等待,我不是 Java 程序员。 :)
  • 对于任何想知道的人,您不能在 IntentService 中使用它
【解决方案2】:

是的,BroadcastReceivers 就是为此而设计的。也就是说,为什么不只创建一个具有 BroadcastReceiver 和所有相关逻辑的父类?那么您的其他活动唯一需要做的就是简单地从该父类继承。

请注意,每次发送广播时,您还应该在持久存储中设置某种全局变量(如共享首选项)。这样,如果在发送广播时您的某个活动不在前台,它可以在onResume() 方法返回时检查持久存储中的变量并采取相应措施。

【讨论】:

    猜你喜欢
    • 2013-07-30
    • 2015-05-26
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 2019-06-21
    • 2010-11-12
    • 1970-01-01
    • 2013-12-19
    相关资源
    最近更新 更多