我正在使用GCM开发一个具有推送通知功能的android应用程序。我创建了一个名为PushNotificationService的类,它扩展了GCMListenerService。在onMessageReceived(String from, Bundle data)中,我能够在推送通知中获得消息。
现在,每当在推送中收到特定消息时,我希望访问我的MainActivity类中的一个方法。
以下是我的代码:-
PushNotificationService.java
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
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
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
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
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中仍然没有被调用。
发布于 2015-11-24 08:24:19
使用eventBus库来促进这个过程..。
我在这个过程中使用了Otto,http://square.github.io/otto/
下面是另一个eventBus库https://greenrobot.github.io/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;
}
}创建上述对象的实例并尝试发布事件
为Jcarlo的评论编辑2
按照以下步骤查找活动的状态。
希望这能有所帮助
发布于 2016-03-30 04:13:50
您可以使用LocalBroadcastManager。在您的LocalBroadcastManager的onCreate上创建一个onCreate对象mBroadcaster = LocalBroadcastManager.getInstance(this);,并使用
@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接收消息。
BroadCastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
beginTask();
}
};此外,您还需要在活动的onStart和onStop中注册和取消接收方。
@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);
}https://stackoverflow.com/questions/33888524
复制相似问题