我正在尝试创建一个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消息时崩溃。 这是我的第一个应用程序,我听不懂其他答案。感谢您的帮助。
答案 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广播。我希望这对您有用。
另一个解决方案是处理程序,但我发现广播接收器是一个很好的选择。