Java 通知活动类
我有两个类,分别是GcmMessageHandler和Control(它是一个活动类,显示了一些图形)。当我处理gcm消息时,我想刷新控制类(但是如果它的前面) 在本部分:Java 通知活动类,java,android,google-cloud-messaging,Java,Android,Google Cloud Messaging,我有两个类,分别是GcmMessageHandler和Control(它是一个活动类,显示了一些图形)。当我处理gcm消息时,我想刷新控制类(但是如果它的前面) 在本部分: if(mes.equals("Control")){ } 如果控件活动类是resume,我想刷新它。我怎样才能做到这一点呢?也许你可以使用观察者设计模式。 让GcmMessageHandler作为观察者保留控件活动,然后在需要时通知它 public class GcmMessageHandler extends Inten
if(mes.equals("Control")){ }
如果控件活动类是resume,我想刷新它。我怎样才能做到这一点呢?也许你可以使用观察者设计模式。 让GcmMessageHandler作为观察者保留控件活动,然后在需要时通知它
public class GcmMessageHandler extends IntentService {
String mes;
private Handler handler;
private Control mObserver
public GcmMessageHandler() {
super("GcmMessageHandler");
}
public void attachObserver(Control ctrl) {
mObserver = ctrl;
}
然后,您只需向控制类添加一个方法,该方法可以从GcmMessageHandler类调用
if(mes.equals("Control")){
mObserver.update(); // example
}else ...
如果您首先定义了一个观察者界面,它会更加流畅:
public interface IObserver {
public abstract void update();
}
让你的控制类来实现。这样,您的GcmMessageHandler类就可以有一个观察者列表:
public class GcmMessageHandler extends IntentService {
String mes;
private Handler handler;
private List<IObserver> mObservers;
public GcmMessageHandler() {
super("GcmMessageHandler");
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
handler = new Handler();
mObservers = new ArrayList<IObserver>();
}
public void attachObserver(Control ctrl) {
mObservers.add(ctrl);
}
private void notify() {
for(IObserver observer : mObservers)
observer.update();
}
您可以使用
BroadcastReceiver
将任何更改通知您的活动。因此,首先在活动中注册一个广播接收器
:
public class MainActivity extends Activity {
public static String REFRESH_ACTIVITY = "com.domain.action.REFRESH_UI"
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// do UI updates
}
};
@Override
public void onResume() {
super.onResume();
// do UI updates
IntentFilter filter = new IntentFilter();
filter.addAction(REFRESH_ACTIVITY);
this.registerReceiver(broadcastReceiver, filter);
}
@Override
public void onPause() {
super.onPause();
this.unregisterReceiver(broadcastReceiver);
}
...
}
然后从任何位置发送广播以执行UI更新:
if (mes.equals("Control")) {
Intent intent = new Intent();
intent.setAction(MainActivity.REFRESH_ACTIVITY);
sendBroadcast(intent);
}
我不确定这是否可能是您想象的方式:要么更新活动中的图形,要么重新启动整个活动。@Zakaria我想通过gcm消息通知mainactivity。但是我不知道如何在没有重新启动的情况下刷新。对不起,我不明白。我想刷新MainActivity(类)。我应该创建另一个类ControlActivity还是在MainActivity中实现。最后一个问题;我应该写什么而不是“com.domain.action.REFRESH_UI”(我的包名是com.test.argeproject),然后使用
MainActivity
(参见上面的更新);添加BroadcastReceiver
成员并(取消)在onResume
/onPause
中注册它,如上所示。使用以下示例发送广播以触发onReceive()
方法。该字符串是自定义的-您可以使用任何其他唯一的字符串(例如,“com.test.argeproject.my_refresh”
)。
public class MainActivity extends Activity {
public static String REFRESH_ACTIVITY = "com.domain.action.REFRESH_UI"
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// do UI updates
}
};
@Override
public void onResume() {
super.onResume();
// do UI updates
IntentFilter filter = new IntentFilter();
filter.addAction(REFRESH_ACTIVITY);
this.registerReceiver(broadcastReceiver, filter);
}
@Override
public void onPause() {
super.onPause();
this.unregisterReceiver(broadcastReceiver);
}
...
}
if (mes.equals("Control")) {
Intent intent = new Intent();
intent.setAction(MainActivity.REFRESH_ACTIVITY);
sendBroadcast(intent);
}