2015-09-09 25 views
0

我刷新活动时遇到了一些问题。我已将GCM侦听器服务添加到我的应用程序中。它的监听器服务应该让我的活动在从GCM服务获取“信息”时进行刷新。我不想建立通知。另外我不想用Timer()定期刷新我的活动。如何刷新GCM侦听器服务的活动

有代码:

MyGcmListenerService.java

public void onMessageReceived(String from, Bundle data) { 
    String message = data.getString("message"); 
    String theme = data.getString("theme"); 
    sendNotification(message,theme); 
} 

private void sendNotification(String message, String theme) { 
    Messages mess = new Messages(); 
    mess.message=message; 
    //what I have to do here to make my FirstLayout.java refresh? 
} 

FirstLayout.java

package com.notif.rasulbek.notifyme; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.TextView; 
import java.util.Timer; 
import java.util.TimerTask; 



public class FirstLayout extends AppCompatActivity { 
    TextView mes; 
    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.first_layout); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     mes = (TextView)findViewById(R.id.firstMes); 

我想替换以下行:

 Timer autoUpdate = new Timer(); 
     autoUpdate.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       runOnUiThread(new Runnable() { 
        public void run() { 
         mes.setText(Messages.message); 
        } 
       }); 
      } 
     }, 0, 2000); 
     }//this approach doesn't like me :(

} 

同样,我想从MyGcmListenerService.java发送一个像signal一样的东西,刷新我的Activity。请任何人帮助我解决这个问题。事先感谢。

回答

2

最简单的方法之一是使用LocalBroadcastManager发送广播,然后在您的活动中使用BroadcastReceiver来收听广播。一旦听众“听到”广播,它可以触发必要的活动更新。

您可以看到this示例应用程序,它在向GCM注册时更新活动。

+0

谢谢,非常好的样品。一切都很清晰 –

0

有两种实现方法。其中一个与@Arthur提到的非常相似,我使用一组不同的API进一步扩展了这个概念。

  • 在GCMIntentService呼叫displayMessage其具有的代码被接收GCM通知时广播消息的方法onReceive
  • MainActivity'sonCreate注册一个接收器来解决这个广播消息。
  • 最后,BroadcastReceiver的onReceive将使用mHandleMessageReceiver调用更新I。

另一个更简单的方法是直接用布尔变量更新onResume中的UI。剩下的idology与上面的策略相同,当收到GCM通知并收到它来更新UI时,您会听广播。

这里是一个示例代码:

protected void onResume() 
{ 
    super.onResume(); 

    update = true;; 
} 

protected void onPause() 
{ 
    super.onPause(); 

    update = false; 
} 

确保update布尔是静态/全局。

+0

嗨AniV,非常感谢您的回答。但是,不幸的是它不工作。更具体的'mes.setText()'当它被'MyGcmListenerService'改变时不能得到'Message.message'变量 –