Android 应用程序终止后侦听firebase事件

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

在应用程序关闭后,我正在尝试收听firebase firestore集合中的更改。为此,我编写了以下代码:

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>