Android- बूट समय पर स्टार्टिंग सेवा


109

मुझे बूट समय पर एक सेवा शुरू करने की आवश्यकता है। मैंने बहुत खोजा। वे ब्रॉडकास्टाइवर के बारे में बात कर रहे हैं। जैसे ही मैं Android विकास में नया हूं, मुझे Android पर सेवाओं के बारे में स्पष्ट तस्वीर नहीं मिली। कृपया कुछ स्रोत कोड प्रदान करें।


25
@ user244540: कृपया इसे हमेशा के लिए चलाने के इरादे से "बूट समय पर एक सेवा शुरू न करें", जब तक कि यह लगातार मूल्य नहीं दे रहा है (उदाहरण के लिए, वीओआइपी क्लाइंट)। उन मामलों में, startForeground()अपनी सेवा में उपयोग करें। अन्यथा, एंड्रॉइड और उसके उपयोगकर्ता अंतरिक्ष की बर्बादी के रूप में आपकी सेवा को मार देंगे, और आपको एंड्रॉइड मार्केट में कुछ अप्रिय टिप्पणियां मिलेंगी। अधिकांश परिस्थितियां जहां आपको लगता है कि आप बूट समय पर शुरू करने के लिए एक सेवा चाहते हैं, तो आप बेहतर सेवा का उपयोग कर रहे हैं AlarmManagerताकि आपकी सेवा लगातार चलने के बजाय समय-समय पर चल सके ।
कॉमन्सवेयर

2
@CommonsWare: अच्छी बात है। हालाँकि, ध्यान दें, कि AlarmManagerपुनरारंभ होने के बाद आवधिक रूप से चलने के लिए , आपको बहुत समान चरणों ( onReceiveविधि की सामग्री में अंतर ) का पालन करने की आवश्यकता है
stanwise

1
@CommonsWare: बहुत अच्छी टिप्पणी है, मैं इस सवाल पर लड़खड़ा गया और आपका इशारा मेरी स्थिति पर सटीक बैठता है। यदि यह एक उत्तर था तो मैंने इसे वोट दिया होगा :-)
chiccodoro

जवाबों:


95

एक बनाएं BroadcastReceiverऔर इसे प्राप्त करने के लिए पंजीकरण करें ACTION_BOOT_COMPLETED । आपको RECEIVE_BOOT_COMPLETED अनुमति की भी आवश्यकता है ।

पढ़ें: ग्लोबल मैसेजेस सुनना और ब्रॉडकास्टिंग करना और अलार्म सेट करना


2
वेक लॉक के बारे में क्या? जबकि सेवा शुरू की जा रही है डिवाइस सो जाने का फैसला कर सकता है ...
मैरिएन Pazdzioch

क्या मुझे सेवा शुरू करने के लिए कम से कम एक बार अपने मोबाइल को बूट करना होगा ??
pathe.kiran

@ MarianPa Mardzioch सही है; आपको एक वेक लॉक चाहिए। नीचे मेरा जवाब देखें: stackoverflow.com/a/30970167/473201
phreakhead

@ pathe.kiran बूट पर, हाँ। देखें commonsware.com/blog/2011/07/05/boot-completed-regression.html
टिम

आपका नवीनतम URL पुराना है
Prizoff

192

आपका रिसीवर:

public class MyReceiver extends BroadcastReceiver {   

    @Override
    public void onReceive(Context context, Intent intent) {

     Intent myIntent = new Intent(context, YourService.class);
     context.startService(myIntent);

    }
}

आपका AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.broadcast.receiver.example"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">

        <activity android:name=".BR_Example"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    <!-- Declaring broadcast receiver for BOOT_COMPLETED event. -->
        <receiver android:name=".MyReceiver" android:enabled="true" android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

    </application>

    <!-- Adding the permission -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

</manifest>

5
लेख का लिंक मृत है, लेकिन नमूना कोड आपको वैसे भी चाहिए, इसलिए +1 :)
एलेक्स

3
वास्तव में, इसमें थोड़ा सुधार करने की आवश्यकता है, आपको रिसीवर में वैकलॉक का उपयोग करना होगा, अन्यथा थोड़ा मौका है कि आपकी सेवा शुरू नहीं हो रही है।
व्लादिमीर इवानोव

क्या मुझे यह काम करने के लिए कम से कम एक बार अपने मोबाइल को बूट करना होगा ??
pathe.kiran

1
नहीं, लेकिन आपको एंड्रॉइड 3.0 के बाद से कम से कम एक एप्लिकेशन को चलाना चाहिए
व्लादिमीर इवानोव

क्या यह काम करता है अगर ऐप को सेटिंग्स से बंद कर दिया जाए? क्या ऐप अभी भी जगेगा?
श्रीहरि कारंत

32

डिवाइस बूट होने पर स्वचालित रूप से शुरू करने के लिए अपनी स्वयं की एप्लिकेशन सेवा को पंजीकृत करना संभव है। आपको इसकी आवश्यकता है, उदाहरण के लिए, जब आप एक http सर्वर से पुश ईवेंट प्राप्त करना चाहते हैं और एक नया ईवेंट होते ही उपयोगकर्ता को सूचित करना चाहते हैं। सेवा शुरू होने से पहले उपयोगकर्ता को मैन्युअल रूप से गतिविधि शुरू करने की आवश्यकता नहीं है ...

यह काफी सरल है। सबसे पहले अपने ऐप को RECEIVE_BOOT_COMPLETED की अनुमति दें। इसके बाद आपको एक ब्रॉडकास्टराइवर रजिस्टर करना होगा। हम इसे BootCompletedIntentReceiver कहते हैं।

आपका घोषणापत्र। Xml अब इस तरह दिखना चाहिए:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.jjoe64">
 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
 <application>
  <receiver android:name=".BootCompletedIntentReceiver">
   <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
   </intent-filter>
  </receiver>
  <service android:name=".BackgroundService"/>
 </application>
</manifest>

अंतिम चरण के रूप में आपको रिसीवर को लागू करना होगा। यह रिसीवर आपकी पृष्ठभूमि सेवा शुरू करता है।

package com.jjoe64;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

import com.jjoe64.BackgroundService;

public class BootCompletedIntentReceiver extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {
  if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
   Intent pushIntent = new Intent(context, BackgroundService.class);
   context.startService(pushIntent);
  }
 }
}

से http://www.jjoe64.com/2011/06/autostart-service-on-device-boot.html


3
ऊपर के रूप में ही है, लेकिन वास्तव में सरल और तेजी से, यह एक का उपयोग करें अगर आप इस पोस्ट द्वारा आते हैं।
dbkoren

अंतर केवल इतना है कि यह सेवा को घोषणापत्र पर घोषित करता है, जो सही है।
जोकिन इचुक

यह केवल आपकी सेवा को प्रकट में घोषित करने के लिए सही नहीं है, यह आवश्यक है। गतिविधियों के साथ के रूप में ही
टिम

मुख्य गतिविधि कहाँ है ?! यह गतिविधियों या बिना एप्लिकेशन बनाने के लिए सही नहीं है android.intent.category.LAUNCHER!
निक

@ L'Esperanza सुनिश्चित करने के लिए, आपके पास ऐसे ऐप्स हो सकते हैं जिनकी कोई दृश्य गतिविधियाँ नहीं हैं!
appsthatmatter

15

यहां पोस्ट किए गए अधिकांश समाधान एक महत्वपूर्ण टुकड़ा याद कर रहे हैं: एक जगा ताला के बिना ऐसा करने से आपकी सेवा समाप्त होने से पहले ही आपकी सेवा समाप्त होने का खतरा रहता है। एक और सूत्र में इस समाधान को देखा, यहाँ भी उत्तर दे रहा है।

WakefulBroadcastReceiver एपीआई 26 में पदावनत है क्योंकि यह 26 से नीचे एपीआई स्तर के लिए अनुशंसित है

आपको एक वेक लॉक प्राप्त करने की आवश्यकता है। सौभाग्य से, समर्थन पुस्तकालय हमें ऐसा करने के लिए एक वर्ग देता है :

public class SimpleWakefulReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // This is the Intent to deliver to our service.
        Intent service = new Intent(context, SimpleWakefulService.class);

        // Start the service, keeping the device awake while it is launching.
        Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime());
        startWakefulService(context, service);
    }
}

फिर, अपनी सेवा में, वेक लॉक जारी करना सुनिश्चित करें:

    @Override
    protected void onHandleIntent(Intent intent) {
        // At this point SimpleWakefulReceiver is still holding a wake lock
        // for us.  We can do whatever we need to here and then tell it that
        // it can release the wakelock.

...
        Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime());
        SimpleWakefulReceiver.completeWakefulIntent(intent);
    }

WAKE_LOCK अनुमति जोड़ने और अपने रिसीवर को मैनिफ़ेस्ट में पंजीकृत करना न भूलें:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

...

<service android:name=".SimpleWakefulReceiver">
    <intent-filter>
        <action android:name="com.example.SimpleWakefulReceiver"/>
    </intent-filter>
</service>

1
मैनिफ़ेस्ट फ़ाइल में, SimpleWakefulReceiver एक सेवा नहीं है।
डेसमंड लुआ

1
WakefulBroadcastReceiver पदावनत है
अमीन पिंजरी

5

आपको BOOT_COMPLETE के साथ-साथ REBOOT के लिए पंजीकरण करना चाहिए

<receiver android:name=".Services.BootComplete">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="android.intent.action.REBOOT"/>
        </intent-filter>
    </receiver> 

2
साहित्य कहता है कि 'android.intent.action.REBOOT' केवल विशेषाधिकार प्राप्त ऐप / कोड द्वारा उपयोग किया जा सकता है। इससे अन्यथा क्या फायदा?
XMAN

1

इसके अलावा मेनिफेस्ट और उपयोग-अनुमति के रूप में अपनी बनाई गई सेवा को पंजीकृत करें

<application ...>
   <service android:name=".MyBroadcastReceiver">
        <intent-filter>
            <action android:name="com.example.MyBroadcastReciver"/>
        </intent-filter>
   </service>
</application>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

और फिर ब्रैड कास्ट में रेकीवर आपकी सेवा को कॉल करता है

public class MyBroadcastReceiver extends BroadcastReceiver 
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Intent myIntent = new Intent(context, MyService.class);
        context.startService(myIntent);
    }
}

सेवा के अंदर आशय फ़िल्टर क्यों?
जोकिन इचुक

क्योंकि जब बूट पूरा हो जाता है तो MyService को कॉल किया जाएगा
सॉफ्टई

उस स्थिति में आपका सेवा वर्ग सेवा और प्रसारण रिसीवर का विस्तार करेगा। क्या मैं सही हू?
जोकिन इराचुक

वर्ग सेवा वर्ग का विस्तार करेगा।
सॉफ्टे

2
यहाँ कुछ गड़बड़ है। ब्रॉडकास्ट रिसीवर से सेवा को बुलाया जाना चाहिए। लेकिन आप कह रहे हैं कि आपकी सेवा प्रसारण रिसीवर है और इसके बाद आप मुझे बताएं कि सेवा वर्ग ब्रॉडकास्ट रिसीवर को विस्तारित नहीं करता है। इस प्रकार, यह बूट कंप्लीट ब्रॉडकास्ट प्राप्त नहीं करेगा। जब आप ऑनरेक्टिव विधि की घोषणा करते हैं तो आप क्या ओवरराइड कर रहे हैं?
जोकिन इराचुक

0

पहले अपने मेनिफ़ेस्ट के लिए एक रिसीवर पंजीकृत करें। xml फ़ाइल:

    <receiver android:name="com.mileagelog.service.Broadcast_PowerUp" >
        <intent-filter>
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
            <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
        </intent-filter>
    </receiver>

और फिर इस रिसीवर के लिए एक प्रसारण लिखें जैसे:

public class Broadcast_PowerUp extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();

    if (action.equals(Intent.ACTION_POWER_CONNECTED)) {
        Toast.makeText(context, "Service_PowerUp Started",
                Toast.LENGTH_LONG).show();


    } else if (action.equals(Intent.ACTION_POWER_DISCONNECTED)) {



        Toast.makeText(context, "Service_PowerUp Stoped", Toast.LENGTH_LONG)
        .show();
    }
  }
}

0

Android Oया अधिक यानी OS> 28 में सेवा को पुनः आरंभ करने के लिए इस कोड का उपयोग करें KOTLIN संस्करण 1) प्रकट में अनुमति जोड़ें

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

2) एक बनाएँ Classऔर इसके साथ विस्तार करेंBroadcastReceiver

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.os.Build
import android.util.Log
import androidx.core.content.ContextCompat



class BootCompletedReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, arg1: Intent?) {
        Log.d("BootCompletedReceiver", "starting service...")
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            ContextCompat.startForegroundService(context, Intent(context, YourServiceClass::class.java))
        } else {
            context.startService(Intent(context, YourServiceClass::class.java))
        }
    }
}

3) एप्लिकेशन टैग के तहत इस तरह मैनिफेस्ट फ़ाइल में घोषणा करें

<receiver android:name=".utils.BootCompletedReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        </intent-filter>
    </receiver>

-1

26 से ऊपर के एपिस के लिए Pls जॉबस्क्राइडर की जांच करें

WakeLock इसके लिए सबसे अच्छा विकल्प था, लेकिन यह एपीआई स्तर 26 में अपग्रेड किया गया है 26 अगर आप 26 से ऊपर के स्तर पर विचार करते हैं, तो इस लिंक की जाँच
करें। startWakefulService (android.content.Context,% 20android.content.Intent)

इसे कहते हैं

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

इतनी के रूप में यह कहते हैं cosider JobScheduler
https://developer.android.com/reference/android/app/job/JobScheduler

यदि इसे शुरू करने की तुलना में कुछ करना है और इसे रखने के लिए आप प्रसारण ACTION_BOOT_COMPLETED प्राप्त कर सकते हैं

अगर यह अग्रभूमि के बारे में नहीं है, तो pls एक एक्सेसिबिलिटी सेवा कर सकते हैं

एक और विकल्प प्रसारण रिसीवर से एक गतिविधि शुरू करना है और ऑनक्रिएट () के भीतर सेवा शुरू करने के बाद इसे समाप्त करना है, क्योंकि नए Android संस्करणों में रिसीवर से सेवाएं शुरू करने की अनुमति नहीं है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.