我是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() {
.....
}
}
我想在android中创建后台服务来监听在FireStore中创建的新文档。
确实,您可以在Android服务中做到这一点,但请记住,服务只是一种方式,您可以告诉操作系统,您有一些后台工作必须完成,而这并不真正需要附加视图(活动)。
根据关于Android服务的官方文件,如果你想尽可能地从一个运行中的服务中获益:
是的,您可以将一个侦听器附加到数据库中的某个文档,甚至附加到一个查询,它将随着结果的变化而更新。但请记住,您将不得不为您获得的每一个更新支付读取操作,这基本上意味着用户还将为带宽和电池耗尽付出代价。所以我总是建议根据活动的生命周期来删除监听器。
这是一种处理Firestore的方式,当您想要在后台收听一些文档时,请同时考虑使用FireBase的云功能:
Firebase的云功能允许您自动运行后端代码,以响应由Firebase特性和HTTPS请求触发的事件。您的代码存储在Google的云中,并在托管环境中运行。不需要管理和扩展自己的服务器。
也许这不是您想要的,发送通知,但这是一个简单的例子,我认为您将能够理解这个想法。
问题内容: 我一直在为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分钟运行一次。 到现在为止还不错,但是现在我有一个错误。我已经尝试过此代码… 有人可以帮我这个忙。 问题答案: 有两种方法可以满足您的要求。 计时器任务 警