首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Android中创建防火墙后台服务?

如何在Android中创建防火墙后台服务?
EN

Stack Overflow用户
提问于 2019-10-08 10:16:57
回答 1查看 2.8K关注 0票数 0

我是Android的新手。我想在android中创建后台服务,以便侦听在Firestore中创建的新文档。我已经准备好了所有的代码,但是服务一次又一次地开始。

  • 你能告诉我该怎么做才能开始服务一次吗?每当我打开应用程序时,它都会在控制台中打印附加>>侦听器的。我希望它只执行一次,并保持它在后台运行。
  • 如果我更新Play store上的应用程序,并使用应用程序中更新的新代码重新启动服务,会发生什么情况?

我遵循的示例代码:https://gist.github.com/vikrum/6170193

AndroidManifest.xml

代码语言:javascript
运行
复制
<?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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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() {
        .....
    }
}
EN

回答 1

Stack Overflow用户

发布于 2019-10-08 10:46:27

我想在android中创建后台服务,以便侦听在Firestore中创建的新文档。

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

根据有关Android服务的官方文档,如果您希望尽可能地从运行中的服务中受益:

前台服务执行一些用户可以注意到的操作。例如,音频应用程序将使用前台服务来播放音频轨道。前台服务必须显示通知。即使用户没有与应用程序交互,前台服务也会继续运行。

因此,换句话说,您需要为通知提供一个图标,这样用户就可以知道应用程序正在消耗资源。

根据你的评论:

不,我想听听在Firestore中创建的新文档。

是的,您可以将侦听器附加到数据库中的某个文档,甚至可以附加到查询,并且随着结果的变化,侦听器也会更新。但是记住,你必须为你得到的每一个更新支付一个读取操作,基本上意味着用户也将有带宽的成本,以及他们的电池损耗的成本。所以我总是推荐根据活动的生命周期移除侦听器。

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

用于Firebase的云功能允许您根据Firebase特性和HTTPS请求触发的事件自动运行后端代码。您的代码存储在Google的云中,并在托管环境中运行。没有必要管理和扩展您自己的服务器。

编辑:

云功能实际上是如何工作的?

与客户端的情况一样,Cloud函数还允许您将侦听器附加到单个文档,甚至连接到查询。因此,当数据库中发生特殊事件时,可以触发云函数,例如,当某些文档被写入Firestore集合时。一旦函数被触发,您就可以采取一些操作。正如Frank在他的评论中提到的,您可以发送通知。对于Android,请参见下面一个简单的示例:

也许这不是你想要的,发送一个通知,但这是一个简单的例子,我认为你可以得到这个想法。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58284392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档