Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.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 Activity与GCMListenerService Android之间的通信_Java_Android_Service_Google Cloud Messaging_Otto - Fatal编程技术网

Java Activity与GCMListenerService Android之间的通信

Java Activity与GCMListenerService Android之间的通信,java,android,service,google-cloud-messaging,otto,Java,Android,Service,Google Cloud Messaging,Otto,我正在使用GCM开发一个具有推送通知功能的android应用程序。我创建了一个名为PushNotificationService的类,它扩展了GCMListenerService。在onMessageReceivedString中,我可以在推送通知中获取捆绑数据 现在,每当推送中收到特定消息时,我想访问MainActivity类中的一个方法 下面是我的代码:- PushNotificationService.java MainActivty.java 我希望无论何时收到消息beginTask,都

我正在使用GCM开发一个具有推送通知功能的android应用程序。我创建了一个名为PushNotificationService的类,它扩展了GCMListenerService。在onMessageReceivedString中,我可以在推送通知中获取捆绑数据

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

下面是我的代码:-

PushNotificationService.java

MainActivty.java

我希望无论何时收到消息beginTask,都执行beginTask方法

我知道一种方法是通过服务->接口->活动体系结构,但我不能使用它,因为我从未创建PushNotificationService的对象

请帮忙

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

添加了新的MyBus.java

PushNotificationService.java

MainActivity.java


这个问题还没有解决。MainActivity.java中的beginTask仍然没有被调用。

使用eventBus库来简化此过程

我使用Otto来完成这个过程 这里是另一个eventBus库

步骤: 1.从服务创建事件 2.在活动中添加一个侦听器 3.如果活动正在运行,则将执行该方法

**编辑1:** 我把奥托巴士抽象成这样

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;
    }
}
创建上述对象的实例并尝试发布事件

编辑2以获取Jcarlo的评论 按照以下步骤查找活动的状态

在活动的onResume中,调用MyBus.getInstance.registerthis。 在活动的onPause中,调用MyBus.getInstance.unregisterthis。 在您的GCM IntentService中发布邮件之前

ifMyBus.getInstance.isRegistered{ //应用程序处于活动状态 //发布数据 }否则{ //显示通知 }


希望这有助于使用eventBus库来简化此过程

我使用Otto来完成这个过程 这里是另一个eventBus库

步骤: 1.从服务创建事件 2.在活动中添加一个侦听器 3.如果活动正在运行,则将执行该方法

**编辑1:** 我把奥托巴士抽象成这样

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;
    }
}
创建上述对象的实例并尝试发布事件

编辑2以获取Jcarlo的评论 按照以下步骤查找活动的状态

在活动的onResume中,调用MyBus.getInstance.registerthis。 在活动的onPause中,调用MyBus.getInstance.unregisterthis。 在您的GCM IntentService中发布邮件之前

ifMyBus.getInstance.isRegistered{ //应用程序处于活动状态 //发布数据 }否则{ //显示通知 }

希望这有助于您使用LocalBroadcastManager。创建一个LocalBroadcastManager对象mBroadcaster=LocalBroadcastManager.getInstancethis;一旦创建您的GCMListener并发送广播

@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);
    }
}
然后,您可以使用BroadcastReceiver在MainActivity中接收消息

此外,您还需要在“活动开始”和“活动停止”中注册和注销接收器

@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);
}
您可以使用LocalBroadcastManager。创建一个LocalBroadcastManager对象mBroadcaster=LocalBroadcastManager.getInstancethis;一旦创建您的GCMListener并发送广播

@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);
    }
}
然后,您可以使用BroadcastReceiver在MainActivity中接收消息

此外,您还需要在“活动开始”和“活动停止”中注册和注销接收器

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

谢谢你的回复。。。我就是这么做的。下载了最后一个Otto jar并将其添加到我的项目中接受答案,以便对社区有所帮助。。。很高兴知道你解决了这个问题谢谢你的回复。。。我已经将otto jar添加到我的项目中。。。在我的PushNotificationService中,我已经将总线初始化为publicstaticbus Bus=newbustreadeforcer.ANY;并已将其注册为bus.registerthis;。然后我在做公共汽车。邮递;在onMessageReceivedString中,绑定数据。在我的MainActivity中,我做了@Subscribe public void beginTaskString str{Log.dGCM,消息:-+str;finish;}。但是我看不到日志消息。这是正确的吗?但它不起作用。。。未调用MainActivity方法。活动正在运行,收到推送消息,应用程序未崩溃/抛出错误。。。。。活动结束了吗。。。结束通话的原因?谢谢你的回复。。。我就是这么做的。下载了最后一个Otto jar并将其添加到我的项目中接受答案,以便对社区有所帮助。。。很高兴知道你解决了这个问题谢谢你的回复。。。我已经将otto jar添加到我的项目中。。。在我的PushNotificationService中,我已经将总线初始化为publicstaticbus Bus=newbustreadeforcer.ANY;并已将其注册为bus.registerthis;。然后我在做公共汽车。邮递;在onMessageReceivedString中,绑定数据。在我的MainActivity中,我做了@Subscribe public void beginTaskString str{Log.dGCM,消息:-+str;
完成 }. 但是我看不到日志消息。这是正确的吗?但它不起作用。。。未调用MainActivity方法。活动正在运行,收到推送消息,应用程序未崩溃/抛出错误。。。。。活动结束了吗。。。finish调用的原因?您尚未注册活动以便总线调用@Subscribe方法。您尚未注册活动以便总线调用@Subscribe方法。
@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);
    }
}
BroadCastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            beginTask();
        }
};
@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);
}