Java Activity与GCMListenerService Android之间的通信
我正在使用GCM开发一个具有推送通知功能的android应用程序。我创建了一个名为PushNotificationService的类,它扩展了GCMListenerService。在onMessageReceivedString中,我可以在推送通知中获取捆绑数据 现在,每当推送中收到特定消息时,我想访问MainActivity类中的一个方法 下面是我的代码:- PushNotificationService.java MainActivty.java 我希望无论何时收到消息beginTask,都执行beginTask方法 我知道一种方法是通过服务->接口->活动体系结构,但我不能使用它,因为我从未创建PushNotificationService的对象 请帮忙 更新:- 我现在正在使用Otto库,下面是我的代码 添加了新的MyBus.java PushNotificationService.java MainActivity.javaJava 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,都
这个问题还没有解决。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);
}