Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Firebase childeventlistener的后台服务几分钟后不工作_Android_Service_Firebase - Fatal编程技术网

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服务接收到消息时,您不需要实际发布通知,它可能只是数据,您可以抓拍一张照片并一直呆在背景中。你想什么时候拍照?拍照就是你想做的吗?例如,如果试图抓住一个电话窃贼,请(在另一个接收器中)监听锁屏故障,然后按下快门