从FirebaseMessagingService调用Activity方法

kri*_*ish 3 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);
}
Run Code Online (Sandbox Code Playgroud)

我的主要活动:

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);
 }
}
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*got 6

调用静态方法将创建该活动的新实例。在这里由于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);
}
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)