Вызов метода Activity из FirebaseMessagingService - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь создать приложение для Android, которое получает сообщение Firebase от сервера и изменяет исходное изображение ImageView, вызывая функцию.

my firebase Service:

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

My 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 голосов
/ 08 октября 2018

Вызов статического метода создаст новый экземпляр этого действия.Здесь его сбой из-за 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);
}
0 голосов
/ 08 октября 2018

Вызов функции активности из любого места не очень хорошая идея, даже если функция статическая.Экземпляр действия тесно связан с ОС Android, и вы потеряете ссылку, как только ОС освободит ссылку на активность.Также вы не можете создать новый экземпляр какой-либо активности с помощью ключевого слова new.

Здесь вы можете использовать широковещательный приемник, вы можете широковещательный приемник и зарегистрировать его в активности и транслировать из firebase.Я надеюсь, что это сработает для вас.

Другое решение также является обработчиком, но я обнаружил, что широковещательный приемник - очень хороший вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...