【问题标题】:Accessing resources of main activity within push receiver访问推送接收器中主要活动的资源
【发布时间】:2015-09-27 07:59:15
【问题描述】:

我的应用需要在普通模式(使用 GUI)、后台模式(更新数据...)下运行并接收推送消息。

现在我想访问主要数据并检查 GUI 当前是否正在运行(同时更新 GUI 元素)。目前我通过在静态成员中存储对主要活动的引用来解决它。所以我的代码如下所示:

public class MainActivity extends Activity {

    public static MainActivity runningInstance = null;
    public final static Object syncObject = new Object();

    @Override public void onCreate(Bundle savedInstanceState) {
        synchronized(syncObject){
            runningInstance = this;
        }
    }

    @Override protected void onDestroy() {
        synchronized(syncObject){
            runningInstance = null;
        }
    }

    //...

}

如您所见,我使用通用对象来同步对静态成员的访问,因为我有过没有这样做就得到 NullPointerException 的情况。

然后我在推送接收器和后台循环中使用它,如下所示:

synchronized(MainActivity.syncObject){
    if(MainActivity.runningInstance != null){
        //Here I know that the GUI is currently running

        //Update GUI elements etc...
    }
}

现在我的问题是:有什么标准方法可以做到这一点,因为我认为从许多其他类访问这个静态成员不是很优雅?

【问题讨论】:

    标签: java android static-members


    【解决方案1】:

    您可以使用IntentService 在后台执行工作。然后在您的Activity 中创建一个BroadCastReceiver 以接收来自IntentService 的状态或结果。阅读更多here

    【讨论】:

      【解决方案2】:

      您可以使用动态广播接收器,并将活动对象传递给构造函数

       public class MessageHandler extends BroadcastReceiver {
      
      YourActivity activity;
      
          public MessageHandler(YourActivity activity) {
                this.activity =activity
              }
      
              @Override
              public void onReceive(Context context, Intent intent) {
                   String newMessage = intent.getExtras().getString("EXTRA");
      
                     if(activty!=null){
                     activty.updateUI();
      
                    }
      
            }
      
          }
      

      在您的活动中,像这样注册您的接收器:

       MessageHandler messageHandler = new MessageHandler(this);
       // Register custom Broadcast receiver to show messages on activity
       registerReceiver(messageHandler, new IntentFilter("DISPLAY"));
      

      现在你注册了接收器来接收动作类型“DISPLAY”的消息

      现在,当您在 GCMIntentService onMessage() 方法中收到消息时,像这样向接收者发送消息:

      Intent intent = new Intent("DISPLAY");
      intent.putExtra("EXTRA", intent.getStringExtra("message"));
      context.sendBroadcast(intent);
      

      这将向您的接收器发送消息,并且您在接收器中拥有您的活动参考做您想做的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多