Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通知活动类_Java_Android_Google Cloud Messaging - Fatal编程技术网

Java 通知活动类

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

我有两个类,分别是GcmMessageHandler和Control(它是一个活动类,显示了一些图形)。当我处理gcm消息时,我想刷新控制类(但是如果它的前面)

在本部分:

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