我的应用需要在正常模式(使用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...
}
}
现在我的问题:有没有任何标准方法如何做到这一点,因为我不认为从许多其他类访问这个静态成员是非常优雅的?
答案 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);
这将向您的接收者发送消息,您在接收器中的活动参考可以做您想要的。