当前位置: 首页 > 知识库问答 >
问题:

如何在Android中创建firebase后台服务?

常炯
2023-03-14

我是Android的新手。我想在android中创建后台服务来监听在FireStore中创建的新文档。我已经准备好了所有的代码,但是服务一次又一次地启动。

>

  • 你能告诉我该怎么做才能开始服务一次吗。每当我打开应用程序时,它就会显示>>listener附加在控制台中。我希望它只执行一次,并保持它在后台运行。

    <?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() {
            .....
        }
    }
    
  • 共有1个答案

    陶英达
    2023-03-14

    我想在android中创建后台服务来监听在FireStore中创建的新文档。

    确实,您可以在Android服务中做到这一点,但请记住,服务只是一种方式,您可以告诉操作系统,您有一些后台工作必须完成,而这并不真正需要附加视图(活动)。

    根据关于Android服务的官方文件,如果你想尽可能地从一个运行中的服务中获益:

    是的,您可以将一个侦听器附加到数据库中的某个文档,甚至附加到一个查询,它将随着结果的变化而更新。但请记住,您将不得不为您获得的每一个更新支付读取操作,这基本上意味着用户还将为带宽和电池耗尽付出代价。所以我总是建议根据活动的生命周期来删除监听器。

    这是一种处理Firestore的方式,当您想要在后台收听一些文档时,请同时考虑使用FireBase的云功能:

    Firebase的云功能允许您自动运行后端代码,以响应由Firebase特性和HTTPS请求触发的事件。您的代码存储在Google的云中,并在托管环境中运行。不需要管理和扩展自己的服务器。

      null

    也许这不是您想要的,发送通知,但这是一个简单的例子,我认为您将能够理解这个想法。

     类似资料:
    • 问题内容: 我一直在为Android开发一个包含后台服务的PhoneGap应用程序。我的问题是:如何调试此服务?是否可以使用AVD进行调试并逐步进行?还是可以使用自己的设备来实现? 谢谢! 问题答案: 是的,可以使用AVD或设备来完成。查看http://www.helloandroid.com/tutorials/how-debug- service 和调试服务。

    • 任何帮助都将得到高度赞赏。求求你了。

    • 请问android可以实现类似于node项目中创建websocket服务吗?

    • 我试图开发一个flutter应用程序,它将从服务器每10秒使用计时器获取数据。它在前景时都工作得很好。所以我按照这里提供的文档工作管理器,我可以从服务器得到数据,即使当应用程序在后台,但不能减少频率低于15分钟。我不想在原生android和iOS中编码。我该如何处理这种情况?有没有我遗漏的解决方案?

    • 问题内容: 我正在开发一个在后台运行的服务,该服务可将图像和数据成功上传到Web。 现在,我要上传相机拍摄的图像。 是否可以在没有Android 2.2预览的情况下在后台服务中使用相机? 我在网上找到了各种对比剂答案… 我该怎么做? 问题答案: 您可以使用虚拟视图拍摄照片而无需预览。 喜欢:

    • 问题内容: 我需要使用Java在Android中创建计划服务。我已经尝试了一些代码,但是在构建应用程序后一直无法运行。我的逻辑很简单,我想提供一个服务来检查蓝牙文件夹路径中文件的存在,如果该文件存在,那么该服务将运行另一个应用程序,我需要它每2分钟运行一次。 到现在为止还不错,但是现在我有一个错误。我已经尝试过此代码… 有人可以帮我这个忙。 问题答案: 有两种方法可以满足您的要求。 计时器任务 警