android - उपयोगकर्ता बल इसे बंद करने के बावजूद स्वचालित रूप से सेवा को पुनरारंभ कैसे करें?




service alarm (7)

मैं अपने आवेदन में हर समय चलाने के लिए एक सेवा चाहता हूँ। इसलिए मैं इसे पुनरारंभ करना चाहता हूं भले ही यह उपयोगकर्ता द्वारा मजबूर हो। ऐसा करने का निश्चित रूप से एक तरीका है क्योंकि फेसबुक जैसे ऐप्स इसे कर रहे हैं। (पुश अधिसूचना का उपयोग करके यह नहीं किया गया है, इंटरनेट इंटरनेट बंद होने पर भी इसकी सेवा को पुनरारंभ करता है)।

किसी भी सहायता की सराहना की जाएगी। धन्यवाद!


अगर मैं सही ढंग से समझता हूं, तो असल में यह संभव नहीं है, एंड्रॉइड फीचर को करीबी एप्लिकेशन को मजबूर करने के लिए डिज़ाइन किया गया था ताकि उपयोगकर्ता अवांछित एप्लिकेशन से छुटकारा पा सके, इसलिए यह तब तक किसी भी गतिविधि को अस्वीकार करता है जब तक कि उपयोगकर्ता अपनी गतिविधि को फिर से शुरू नहीं कर लेता।

ऐप को बंद करने के बाद भी सेवा को पुनरारंभ करें और ऐप बंद करने के बाद भी पृष्ठभूमि में सेवा चलाना जारी रखें?


आपको onTaskRemoved विधि को ओवरराइड करने के साथ एक sticky service बनाना है, जहां आप अपना कोड फिर से ट्रिगर करने के लिए अलार्म सेवा सेट कर सकते हैं।

public class BackgroundService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        //create an intent that you want to start again.
        Intent intent = new Intent(getApplicationContext(), BackgroundService.class);
        PendingIntent pendingIntent = PendingIntent.getService(this, 1, intent, PendingIntent.FLAG_ONE_SHOT);
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() + 5000, pendingIntent);
        super.onTaskRemoved(rootIntent);
    }
}

इसके अलावा ज़ियामी, हुवेई जैसे कुछ उपकरणों में ऐप को हालिया ऐप्स से हटा दिए जाने के बाद बल बंद हो जाता है। ऐसा इसलिए है क्योंकि निर्माताओं में कार्य प्रबंधक सुविधाएं होती हैं जो रैम / बैटरी प्रदर्शन में सुधार करती हैं।

आप अधिक जानकारी के लिए इस लिंक को देख सकते हैं: https://.com/a/41360159/2798289


जब भी कोई सेवा मारे जाती है, तो इसकी onDestroy विधि हमेशा कॉल की जाती है। जब इसे मारा जाता है तो अपनी सेवा शुरू करने के लिए ब्रॉडकास्ट रिसीवर का उपयोग करना बेहतर होता है।

यहां एक कार्यान्वयन चित्रण नमूना कोड है: -

@Override
public void onDestroy() {
Intent in = new Intent();
in.setAction("StartkilledService");
sendBroadcast(in);
Log.d("debug", "Service Killed");
}

फिर AndroidManifest.xml में एक रिसीवर पंजीकृत करें: -

<receiver android:name=".app.ServiceDestroyReceiver" >
    <intent-filter>
        <action android:name="StartKilledService" >
        </action>
    </intent-filter>
</receiver>

अंत में, ब्रॉडकास्ट onReceive बनाएं, और अपनी सेवा को onReceive विधि में शुरू करें: -

@Override
public void onReceive(Context context, Intent intent) {
Log.d("debug", "ServeiceDestroy onReceive...");
Log.d("debug", "action:" + intent.getAction());
Log.d("debug", "Starting Service");
ServiceManager.startService();
}

उम्मीद है की यह मदद करेगा।


मुझे लगता है कि यहां केवल मूर्खतापूर्ण समाधान अलग-अलग प्रक्रियाओं में 2 सेवाएं हैं ( android:process="somecustomprocessname" सेवा प्रविष्टि में android:process="somecustomprocessname" , सेवा प्रविष्टि में) कि दोनों प्रसारण सुनते हैं और एक-दूसरे को पुनरारंभ करते हैं, क्योंकि वर्तमान में यूआई उपयोगकर्ताओं को नहीं देता है एक प्रक्रिया में कई प्रक्रियाओं को मार डालो। फिर आप प्रत्येक सेवा में एक पिंगर थ्रेड सेट कर सकते हैं जो जांचता है कि क्या दूसरी सेवा हर 100 मिलीसेकंड चला रही है या नहीं, और यदि नहीं, तो इसे पुनरारंभ करने का प्रयास करें। लेकिन यह मैलवेयर की तरह अधिक से अधिक दिखने शुरू हो रहा है ...


सबसे पहले, यह उपयोगकर्ता की इच्छा के खिलाफ बलपूर्वक सेवा चलाने के लिए वास्तव में बहुत खराब पैटर्न है।

वैसे भी, आप BroadcastReceiver onDestroy() का उपयोग करके इसे पुनरारंभ कर सकते हैं जो आपकी सेवा के onDestroy() से भेजे गए प्रसारण को संभालता है।

StickyService.java

public class StickyService extends Service
{
    private static final String TAG = "StickyService";


    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG, "onStartCommand");
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        sendBroadcast(new Intent("YouWillNeverKillMe"));
    }

}

RestartServiceReceiver.java

public class RestartServiceReceiver extends BroadcastReceiver
{

    private static final String TAG = "RestartServiceReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e(TAG, "onReceive");
    context.startService(new Intent(context.getApplicationContext(), StickyService.class));

    }

}

मैनिफेस्ट फ़ाइल में घटकों की घोषणा करें:

    <service android:name=".StickyService" >
    </service>

    <receiver android:name=".RestartServiceReceiver" >
        <intent-filter>
            <action android:name="YouWillNeverKillMe" >
            </action>
        </intent-filter>
    </receiver>

एक घटक में StickyService शुरू करें (यानी Application , Activity , Fragment ):

startService(new Intent(this, StickyService.class));

या

sendBroadcast(new Intent("YouWillNeverKillMe"));

सेवा की शुरुआत पर कमांड विधि वापस लौटें START_STICKY। आम तौर पर यह ओएस को मारने पर सेवा शुरू करने के लिए कहता है।


सेवाओं को जीवित रखने का एकमात्र असली समाधान Service.startForeground(...) प्रदान करना है। प्रारंभिक अधिसूचना के साथ Service.startForeground(...) । यह एकमात्र वैध समाधान होगा, हर कोई इस बात पर निर्भर करेगा कि Google इसके सिस्टम के व्यवहार को कैसे बदल देगा। प्रत्येक एपीआई अपडेट के साथ, Google हर दूसरे हैक को रोक सकता है।

यह उपयोगकर्ता को जागरूक रखता है, कि आपका ऐप कुछ पृष्ठभूमि कार्य कर रहा है जो ऐप को जीवंत रखेगा और उपयोगकर्ता को इसे रोकना होगा। यदि आप उपयोगकर्ता को इसे रोकने की क्षमता प्रदान करते हैं, तो यह आपके आवेदन का हिस्सा है।

दस्तावेज़ीकरण देखें:

void startForeground (int id, Notification notification)

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





alarm