在推送接收器内访问主要活动的资源

时间:2015-09-27 07:59:15

标签: java android static-members

我的应用需要在正常模式(使用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...
    }
}

现在我的问题:有没有任何标准方法如何做到这一点,因为我不认为从许多其他类访问这个静态成员是非常优雅的?

2 个答案:

答案 0 :(得分:0)

您可以使用IntentService在后​​台执行作业。然后在Activity中创建一个BroadCastReceiver,以便从IntentService接收状态或结果。阅读更多here

答案 1 :(得分:0)

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

 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);

这将向您的接收者发送消息,您在接收器中的活动参考可以做您想要的。