Я работаю над приложением для Android с функцией push-уведомлений с использованием GCM. Я создал класс PushNotificationService, который расширяет GCMListenerService. Внутри onMessageReceived(String from, Bundle data)
я могу получить сообщение в push-уведомлении.
Теперь я хочу получить доступ к методу внутри моего класса MainActivity всякий раз, когда в push-уведомлении принимается конкретное сообщение.
Ниже мой код: -
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() выполнялся всякий раз, когда получено сообщение «Начать задачу».
Я знаю, что один из подходов — через архитектуру Service->Interface->Activity, но я не могу использовать его, так как никогда не создаю объект PushNotificationService.
Пожалуйста помоги.
ОБНОВЛЕНИЕ:- Сейчас я использую библиотеку Otto, и ниже приведен мой код.
Добавлен новый 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 по-прежнему не вызывается.