首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Activity与GCMListenerService Android的通信

问Activity与GCMListenerService Android的通信
EN

Stack Overflow用户
提问于 2015-11-24 08:19:00
回答 2查看 2.2K关注 0票数 1

我正在使用GCM开发一个具有推送通知功能的android应用程序。我创建了一个名为PushNotificationService的类,它扩展了GCMListenerService。在onMessageReceived(String from, Bundle data)中,我能够在推送通知中获得消息。

现在,每当在推送中收到特定消息时,我希望访问我的MainActivity类中的一个方法。

以下是我的代码:-

PushNotificationService.java

代码语言:javascript
复制
public class PushNotificationService extends GcmListenerService {

@Override
    public void onMessageReceived(String from, Bundle data) {
        // TODO Auto-generated method stub
        super.onMessageReceived(from, data);



         String message = data.getString("message");

         if(message.equalsIgnoreCase("Begin Task"))
            {

                    //call method from MainActivity.class

            }

        }
}

MainActivty.java

代码语言:javascript
复制
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public void beginTask()

    {

        Log.d("GCM","Message Received from Server");
        finish();

    }
}

每当收到消息“BEGINTask”时,我希望beginTask()方法执行。

我知道一种方法是通过服务->接口->活动架构,但是我不能使用它,因为我从来没有创建过PushNotificationService.的对象。

请帮帮忙。

更新:-我现在使用的是库,下面是我的代码。

添加了新的MyBus.java

代码语言:javascript
复制
public class MyBus extends Bus {
    private static Bus bus;
    //isRegistered is used to track the current registration status
    private static boolean isRegistered;
    private Handler handler = new Handler(Looper.getMainLooper());

    public MyBus() {
        if (bus == null) {
            //ANY will allow event bus to run even with services
            //and broadcast receivers
            bus = new Bus(ThreadEnforcer.ANY);
        }
    }

    @Override
    public void register(Object obj) {
        //The bus is registered when an activity starts
        bus.register(obj);
        isRegistered = true;
    }

    @Override
    public void unregister(Object obj) {
        //The bus is unregistered when an activity goes to background
        bus.unregister(obj);
        isRegistered = false;
    }

    @Override
    public void post(final Object event) {
        if (Looper.myLooper() == Looper.getMainLooper()) {
            //post the event in main thread or background thread
            bus.post(event);
        } else {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    bus.post(event);
                }
            });
        }
    }

    public boolean isRegistered(){
        return isRegistered;
    }
}

PushNotificationService.java

代码语言:javascript
复制
public class PushNotificationService extends GcmListenerService {

@Override
    public void onMessageReceived(String from, Bundle data) {
        // TODO Auto-generated method stub
        super.onMessageReceived(from, data);

        MyBus myBus = new MyBus();
        myBus.register(myBus);

         String message = data.getString("message");

         if(message.equalsIgnoreCase("Begin Task"))
            {

                    myBus.post(message);

            }

        }
}

MainActivity.java

代码语言:javascript
复制
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    @Subscribe
    public void beginTask()

    {

        Log.d("GCM","Message Received from Server");


    }
}

问题仍未得到解决,问题仍未得到解决。beginTask()在MainActivity.java中仍然没有被调用。

EN

回答 2

Stack Overflow用户

发布于 2015-11-24 08:24:19

使用eventBus库来促进这个过程..。

我在这个过程中使用了Otto,http://square.github.io/otto/

下面是另一个eventBus库https://greenrobot.github.io/EventBus/

步骤:

1.从服务中创建事件

2.在活动中添加侦听器

3.如果活动正在运行,则将执行该方法。

**编辑1:*

我把奥托巴士抽象成这样。

代码语言:javascript
复制
package com.mypackage.eventBus;

import android.os.Handler;
import android.os.Looper;

import com.squareup.otto.Bus;
import com.squareup.otto.ThreadEnforcer;

/**
 * Created by gowtham on 10/6/15.
 */
public class MyBus extends Bus {
    private static Bus bus;
    //isRegistered is used to track the current registration status
    private static boolean isRegistered;
    private Handler handler = new Handler(Looper.getMainLooper());

    public MyBus() {
        if (bus == null) {
            //ANY will allow event bus to run even with services
            //and broadcast receivers
            bus = new Bus(ThreadEnforcer.ANY);
        }
    }

    @Override
    public void register(Object obj) {
        //The bus is registered when an activity starts
        bus.register(obj);
        isRegistered = true;
    }

    @Override
    public void unregister(Object obj) {
        //The bus is unregistered when an activity goes to background
        bus.unregister(obj);
        isRegistered = false;
    }

    @Override
    public void post(final Object event) {
        if (Looper.myLooper() == Looper.getMainLooper()) {
            //post the event in main thread or background thread
            bus.post(event);
        } else {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    bus.post(event);
                }
            });
        }
    }

    public boolean isRegistered(){
        return isRegistered;
    }
}

创建上述对象的实例并尝试发布事件

为Jcarlo的评论编辑2

按照以下步骤查找活动的状态。

  1. 在您的活动的onResume调用MyBus.getInstance().register(this)中。
  2. 在您的活动的onPause调用MyBus.getInstance().unregister(this)中。
  3. 在发布消息之前,在GCM IntentService中 如果(MyBus.getInstance().isRegistered()){ //app是活着的//post数据},则{//显示通知}

希望这能有所帮助

票数 3
EN

Stack Overflow用户

发布于 2016-03-30 04:13:50

您可以使用LocalBroadcastManager。在您的LocalBroadcastManager的onCreate上创建一个onCreate对象mBroadcaster = LocalBroadcastManager.getInstance(this);,并使用

代码语言:javascript
复制
@Override
public void onCreate() {
    super.onCreate();
    mBroadcaster = LocalBroadcastManager.getInstance(this);
}

@Override
public void onMessageReceived(String from, Bundle data) {
    super.onMessageReceived(from, data);

     String message = data.getString("message");

     if(message.equalsIgnoreCase("Begin Task")) {
        Intent i = new Intent();
        i.setAction("yourPackageName");
        i.putExtra("DATA", yourData);
        mBroadcaster.send(i);
    }
}

然后,您可以在MainActivity中使用BroadcastReceiver接收消息。

代码语言:javascript
复制
BroadCastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            beginTask();
        }
};

此外,您还需要在活动的onStart和onStop中注册和取消接收方。

代码语言:javascript
复制
@Override
protected void onStart() {
    super.onStart();
    IntentFilter filter = new IntentFilter();

    filter.addAction("yourPackageName);
    LocalBroadcastManager.getInstance(this).registerReceiver((mBroadcastReceiver), filter);
}

@Override
protected void onStop() {
    super.onStop();
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mBroadcastReceiver);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33888524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档