从FirebaseMessagingService调用Activity方法

时间:2018-10-08 08:19:41

标签: android firebase firebase-cloud-messaging

我正在尝试创建一个Android应用,该应用从服务器接收Firebase消息并通过调用函数来更改ImageView的源图像。

我的firebase服务:

public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);
    String body = remoteMessage.getNotification().getBody();
    MainActivity.changeUi(body);
}

我的MainActivity:

public class MainActivity extends AppCompatActivity {
static ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //Loading Home Layout
    setContentView(R.layout.activity_home);
    iv=findViewById(R.id.imgView);
}
 public static void changeUi(String s){
    if(s=="change")
      iv.setImageResource(R.drawable.image2);
 }
}

应用在发送Firebase消息时崩溃。 这是我的第一个应用程序,我听不懂其他答案。感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

调用静态方法将创建该活动的新实例。在这里由于imageView未初始化而崩溃。

您可以在此处使用BroadCast Receiver。下面是一个示例。

public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);
    String body = remoteMessage.getNotification().getBody();
    Intent myIntent = new Intent("FBR-IMAGE");
    myIntent.putExtra("action",body);
    this.sendBroadcast(myIntent);
}

在“活动”中,您需要创建并注册接收者

public BroadcastReceiver myReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getStringExtra("action");
        changeUi(action);
    }
};

@Override
protected void onResume() {
    super.onResume();
    registerReceiver(myReceiver, new IntentFilter("FBR-IMAGE"));
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(myReceiver);
}

答案 1 :(得分:0)

从任何地方调用活动功能不是一个好主意,即使该功能是静态的。活动实例与android操作系统紧密相关,您将在操作系统释放活动引用后立即松开引用。同样,您无法使用new关键字来创建任何活动的新实例。

在这里您可以使用广播接收器,可以在广播接收器中注册并将其注册到活动并从Firebase广播。我希望这对您有用。

另一个解决方案是处理程序,但我发现广播接收器是一个很好的选择。