Vic*_*kor 0 java android firebase google-cloud-firestore
我是安卓的新手。我想在 android 中创建后台服务来监听在 Firestore 中创建的新文档。我已经准备好了所有的代码,但坚持一次又一次地开始服务。
你能告诉我应该怎么做才能只启动一次服务。每当我打开应用程序时,它都会打印>> 附加在控制台中的侦听器。我希望它只执行一次并保持在后台运行。
如果我在 Play 商店更新应用程序,并且它会使用应用程序中更新的新代码重新启动服务,会发生什么情况?
我遵循的示例代码: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>
Run Code Online (Sandbox Code Playgroud)
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;
}
}
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
注册.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() {
.....
}
}
Run Code Online (Sandbox Code Playgroud)
我想在 android 中创建后台服务来监听在 Firestore 中创建的新文档。
确实,您可以在 Android 服务中执行此操作,但请记住,服务仅代表一种方式,您可以通过这种方式告诉操作系统您有一些必须完成的后台工作,并且不需要附加视图(活动)。
根据关于Android services的官方文档,如果您想尽可能多地从正在运行的服务中受益:
前台服务执行一些用户可以注意到的操作。例如,音频应用程序将使用前台服务来播放音轨。前台服务必须显示一个Notification。即使用户没有与应用程序交互,前台服务也会继续运行。
换句话说,您需要为通知提供一个图标,以便通知用户该应用程序正在消耗资源。
根据您的评论:
不,我想收听在 Firestore 中创建的新文档。
是的,您可以将侦听器附加到数据库中的某个文档,甚至附加到查询,它会随着结果的变化而更新。但请记住,您必须为获得的每个更新支付一次读取操作,这基本上意味着用户还将承担带宽成本和电池消耗成本。所以我总是建议根据 Activity 的生命周期来移除监听器。
当您想在后台收听某些文档时,这是您处理 Firestore 的一种方式,但也请考虑使用Cloud Functions for Firebase:
Cloud Functions for Firebase 可让您自动运行后端代码以响应 Firebase 功能和 HTTPS 请求触发的事件。您的代码存储在 Google 的云中并在托管环境中运行。无需管理和扩展您自己的服务器。
编辑:
Cloud Functions 实际上是如何工作的?
与客户端的情况一样,Cloud Functions 还允许您将侦听器附加到单个文档甚至查询。因此,当您的数据库中发生某些特殊情况时,可以触发 Cloud Functions 函数,例如当某些文档被写入 Firestore 集合时。一旦该功能被触发,您就可以采取一些行动。正如 Frank van Puffelen 在评论中提到的,您可以发送通知。对于 Android,请参见下面的简单示例:
也许这不是你想要的,发送通知,但这是一个简单的例子,我想你会明白的。
| 归档时间: |
|
| 查看次数: |
2080 次 |
| 最近记录: |