Android 应用程序终止后侦听firebase事件
在应用程序关闭后,我正在尝试收听firebase firestore集合中的更改。为此,我编写了以下代码:Android 应用程序终止后侦听firebase事件,android,firebase,google-cloud-firestore,Android,Firebase,Google Cloud Firestore,在应用程序关闭后,我正在尝试收听firebase firestore集合中的更改。为此,我编写了以下代码: FirebaseFirestore.getInstance().collection("demo").addSnapshotListener(new EventListener<QuerySnapshot>() { @Override public void onEvent(@Nullable QuerySna
FirebaseFirestore.getInstance().collection("demo").addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) {
//show a notification to user
...
...
Toast.makeText(MainActivity.this, "collection modified", Toast.LENGTH_SHORT).show();
}
});
MainActivity.java
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
FirebaseFirestore.getInstance().collection("demo").addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) {
Toast.makeText(context, "collection modified", Toast.LENGTH_LONG).show();
}
});
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startFirebaseTesting();
}
});
}
private void startFirebaseTesting() {
Intent in = new Intent(this, FirebaseService.class);
in.setAction("com.example.this.app");
in.addCategory("android.intent.category.DEFAULT");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 4, in, PendingIntent.FLAG_ONE_SHOT|PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+1000*5, pendingIntent);
} else
alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+1000*5, pendingIntent);
}
}
AndroidManifest.xml
<application>
...
...
<receiver
android:name=".AlarmReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.this.app"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>
...
...
</application>
这两种解决方案在MotoG5s plus(Oreo)和三星A50(Android 10)上都不起作用。只要您希望在后台运行任何代码,都可以使用
因此,在我们的例子中,它将是这样的:
创建一个firebaservice.java
类
注:
当服务启动时,它的生命周期独立于启动它的组件。该服务可以无限期地在后台运行,即使启动它的组件已被销毁。因此,服务应该在其作业完成时通过调用stopSelf()停止自身,或者其他组件可以通过调用stopService()停止它
每个服务都必须在Manifest.xml
文件中声明
...
因为您可以轻松显示内置通知,而不必担心生命周期
如果您想使用此方法,下面是一个完整的教程,可以帮助您:
阅读有关android服务的内容,并将其用于您的实现,因为您希望在应用程序关闭时仍能运行某个操作。每当我从最近的屏幕上轻扫应用程序时,会显示带有消息“service done”(服务完成)的Toast
,但它应该在后台监听集合中的任何更改。请查看以下答案:如果这是您的用例,我强烈建议使用FCM进行通知。自从安卓8.0以来,创建一个一直运行的服务可能有点困难。不过,如果您想使用服务执行此操作,请使用带有不可拒绝通知的前台服务。如果你觉得答案有用,别忘了把它标记为答案。
public class FirebaseService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(getApplicationContext(), "service starting", Toast.LENGTH_SHORT).show();
FirebaseFirestore.getInstance().collection("demo").addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) {
//show a notification to user
Toast.makeText(getApplicationContext(), "collection modified", Toast.LENGTH_SHORT).show();
}
});
// If we get killed, after returning from here, restart
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// We don't provide binding, so return null
return null;
}
@Override
public void onDestroy() {
Toast.makeText(getApplicationContext(), "service done", Toast.LENGTH_SHORT).show();
}
}
Intent intent = new Intent(this, FirebaseService.class);
startService(intent);
<manifest ... >
...
<application ... >
<service android:name=".FirebaseService" />
...
</application>
</manifest>