我是Android的新手。我想在android中创建后台服务,以便侦听在Firestore中创建的新文档。我已经准备好了所有的代码,但是服务一次又一次地开始。
我遵循的示例代码:https://gist.github.com/vikrum/6170193
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.demo">
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".SignUp">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- Other activities -->
<!-- authentication service -->
<service android:name=".service.firestore.listener.FirestoreActivityListener"
android:exported="false"
android:process=":remote">
</service>
</application>
</manifest>
FirestoreActivityListener.java
package com.demo.service.firestore.listener;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import com.google.firebase.FirebaseApp;
import com.google.firebase.firestore.DocumentChange;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;
import com.google.firebase.firestore.FirebaseFirestoreSettings;
import com.google.firebase.firestore.QuerySnapshot;
import javax.annotation.Nullable;
import static com.google.firebase.firestore.DocumentChange.Type.ADDED;
/**
* @author vicky.thakor
* @since 2019-02-06
*/
public class FirestoreActivityListener extends Service {
private static final String COLLECTION = "users/%s/activities";
private FirebaseFirestore firestore;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
FirebaseApp.initializeApp(this);
this.firestore = FirebaseFirestore.getInstance();
FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
.setTimestampsInSnapshotsEnabled(true)
.build();
firestore.setFirestoreSettings(settings);
activitiesListener();
}
public void activitiesListener(){
System.err.println(">> listener attached");
firestore.collection(String.format(COLLECTION, "xxxxxxxxx"))
.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot querySnapshot, @Nullable FirebaseFirestoreException e) {
for (DocumentChange dc : querySnapshot.getDocumentChanges()) {
switch (dc.getType()) {
case ADDED:
System.err.println(">> " + dc.getDocument().toString());
break;
}
}
}
});
}
}
SignUp.java
package com.demo;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Button;
import android.widget.EditText;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseException;
import com.google.firebase.FirebaseTooManyRequestsException;
import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException;
import com.google.firebase.auth.PhoneAuthCredential;
import com.google.firebase.auth.PhoneAuthProvider;
import com.demo.home.Home;
import com.demo.model.ParcelableUser;
import com.demo.repository.SharedPreferencesRepository;
import com.demo.repository.impl.SharedPreferencesRepositoryImpl;
import com.demo.service.firestore.listener.FirestoreActivityListener;
import com.demo.util.AlertUtil;
import com.demo.util.IntentConstants;
import com.demo.util.StringUtil;
import java.util.concurrent.TimeUnit;
public class SignUp extends AppCompatActivity {
private SharedPreferencesRepository sharedPreferencesRepository;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* initialization */
sharedPreferencesRepository = new SharedPreferencesRepositoryImpl(this);
startService(new Intent(this, FirestoreActivityListener.class));
verifyRegisteredUser();
setContentView(R.layout.signup);
registerNewUser();
}
private void verifyRegisteredUser() {
.....
}
private void registerNewUser() {
.....
}
}
发布于 2019-10-08 10:46:27
我想在android中创建后台服务,以便侦听在Firestore中创建的新文档。
确实,在Android服务中您可以这样做,但是请记住,服务只代表一种方式,您可以告诉操作系统,您有一些必须完成的后台工作,而这并不需要附加的视图(活动)。
根据有关Android服务的官方文档,如果您希望尽可能地从运行中的服务中受益:
前台服务执行一些用户可以注意到的操作。例如,音频应用程序将使用前台服务来播放音频轨道。前台服务必须显示通知。即使用户没有与应用程序交互,前台服务也会继续运行。
因此,换句话说,您需要为通知提供一个图标,这样用户就可以知道应用程序正在消耗资源。
根据你的评论:
不,我想听听在Firestore中创建的新文档。
是的,您可以将侦听器附加到数据库中的某个文档,甚至可以附加到查询,并且随着结果的变化,侦听器也会更新。但是记住,你必须为你得到的每一个更新支付一个读取操作,基本上意味着用户也将有带宽的成本,以及他们的电池损耗的成本。所以我总是推荐根据活动的生命周期移除侦听器。。
当您想要在后台收听一些文档时,这是您处理Firestore的一种方式,但也请考虑使用Firebase的云功能
用于Firebase的云功能允许您根据Firebase特性和HTTPS请求触发的事件自动运行后端代码。您的代码存储在Google的云中,并在托管环境中运行。没有必要管理和扩展您自己的服务器。
编辑:
云功能实际上是如何工作的?
与客户端的情况一样,Cloud函数还允许您将侦听器附加到单个文档,甚至连接到查询。因此,当数据库中发生特殊事件时,可以触发云函数,例如,当某些文档被写入Firestore集合时。一旦函数被触发,您就可以采取一些操作。正如Frank在他的评论中提到的,您可以发送通知。对于Android,请参见下面一个简单的示例:
也许这不是你想要的,发送一个通知,但这是一个简单的例子,我认为你可以得到这个想法。
https://stackoverflow.com/questions/58284392
复制相似问题