বুট সময় অ্যান্ড্রয়েড-স্টার্টিং পরিষেবা


109

বুট করার সময় আমার একটি পরিষেবা শুরু করা দরকার। আমি অনেক খোঁজাখুঁজি করেছি। তারা ব্রডকাস্ট্রেসিভার নিয়ে কথা বলছে। আমি যেমন অ্যান্ড্রয়েড বিকাশে নতুন, আমি অ্যান্ড্রয়েডে পরিষেবাদি সম্পর্কে একটি পরিষ্কার ছবি পাইনি। দয়া করে কিছু উত্স কোড সরবরাহ করুন।


25
@ ব্যবহারকারী ২৪৪৪০৪০: দয়া করে "বুট সময় কোনও পরিষেবা শুরু করবেন না" এর উদ্দেশ্য নিয়ে চিরকাল চলে, যদি না এটি ক্রমাগত মান সরবরাহ করা হয় (যেমন, কোনও ভিওআইপি ক্লায়েন্ট)। এই ক্ষেত্রে, startForeground()আপনার পরিষেবা ব্যবহার করুন। অন্যথায়, অ্যান্ড্রয়েড এবং এর ব্যবহারকারীরা আপনার পরিষেবাটি জায়গার অপচয় হিসাবে শেষ করে দেবে, এবং অ্যান্ড্রয়েড বাজারে আপনি কিছু অপ্রীতিকর মন্তব্য পেয়ে যাবেন। বেশিরভাগ পরিস্থিতি যেখানে আপনি মনে করেন যে আপনি কোনও পরিষেবা বুট করার সময় শুরু করতে চান, আপনাকে ব্যবহার করে আরও ভাল পরিবেশিত হবে AlarmManagerযাতে আপনার পরিষেবা নিয়মিত না হয়ে সময়-সময় চলতে পারে
কমন্সওয়্যার

2
@ কমন্সওয়্যার: ভালো কথা। তবে নোট করুন, AlarmManagerপুনরায় চালু হওয়ার পরে পর্যায়ক্রমিক রান শুরু করতে আপনাকে খুব অনুরূপ পদক্ষেপগুলি অনুসরণ করতে হবে ( onReceiveপদ্ধতির বিষয়বস্তুতে পার্থক্য )
stanwise

1
@ কমন্সওয়্যার: খুব ভাল মন্তব্য, আমি এই প্রশ্নটি নিয়ে হোঁচট খেয়েছি এবং আপনার ইঙ্গিতটি আমার পরিস্থিতির সাথে পুরোপুরি ফিট করে। যদি এটির উত্তর হয় আমি এটিতে ভোট দিতাম :-)
চিককোডোরো

উত্তর:


95

ACTION_BOOT_COMPLETEDBroadcastReceiver পাওয়ার জন্য একটি তৈরি করুন এবং এটি রেজিস্টার করুন । আপনারও প্রয়োজন RECEIVE_BOOT_COMPLETED অনুমতি।

পড়ুন: শুনছেন এবং গ্লোবাল বার্তা সম্প্রচারের জন্য এবং অ্যালার্ম সেট করা


2
ওয়েক লক সম্পর্কে কি? পরিষেবা শুরু করার সময় ডিভাইস ঘুমিয়ে যাওয়ার সিদ্ধান্ত নিতে পারে ...
মারিয়ান পাডজিওচ

কোনও পরিষেবা শুরু করার জন্য আমার কি একবারে আমার মোবাইল বুট করা দরকার ??
pathe.kiran

@ মারিয়ানপাডজিওচ ঠিক আছে; আপনার একটি ওয়েক লক দরকার need : নীচের আমার উত্তর দেখুন stackoverflow.com/a/30970167/473201
phreakhead

@ pathe.kiran বুটে, হ্যাঁ দেখুন commonsware.com/blog/2011/07/05/boot-completed-regression.html
টিম

আপনার সর্বশেষ URL টি পুরানো
প্রিজফ

192

আপনার রিসিভার:

public class MyReceiver extends BroadcastReceiver {   

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

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

    }
}

আপনার AndroidManLive.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। এর পরে আপনার একটি ব্রডকাস্টারভিভার নিবন্ধন করতে হবে। আমরা এটিকে বুট কমপ্লিটড ইনট্রেসিভার বলি।

আপনার ম্যানিফেস্ট.এক্সএমএল এখন দেখতে হবে:

<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

এখানে পোস্ট করা বেশিরভাগ সমাধান একটি গুরুত্বপূর্ণ টুকরো অনুপস্থিত: একটি ওয়েক লক ছাড়াই এটি করা আপনার পরিষেবাটি প্রক্রিয়া শেষ হওয়ার আগেই মারা যাওয়ার ঝুঁকি নিয়ে চলেছে। এই সমাধানটি অন্য থ্রেডে দেখেছি, এখানেও উত্তর দিচ্ছি।

যেহেতু ওয়েকফুলড্রোডকাস্ট রিসিভারটি এপিআই 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);
    }

ডাব্লুএক।

<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
ম্যানিফেস্ট ফাইলটিতে, সিম্পল ওয়েকফুলআরসিভার কোনও পরিষেবা নয়।
ডেসমন্ড লুয়া

1
ওয়েকফুলড্রোডকাস্ট রিসিভার অবচিত হয়েছে
আমিন

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' কেবল সুবিধাযুক্ত অ্যাপ / কোড দ্বারা ব্যবহার করা যেতে পারে। এটা অন্যথায় কি লাভ?
এক্সএমএএন

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);
    }
}

কেন পরিষেবা ভিতরে ইনটেন্ট ফিল্টার?
জোয়াকুইন ইয়ারচুক

কারণ বুটটি শেষ হয়ে গেলে মাই সার্ভিস ডেকে আনা হবে
সফটইয়ে

সেক্ষেত্রে আপনার পরিষেবা শ্রেণি পরিষেবা এবং সম্প্রচারের প্রাপককে প্রসারিত করবে। আমি কি সঠিক?
জোয়াকিন ইরচুক

ক্লাসটি পরিষেবা শ্রেণিকে প্রসারিত করবে।
সফ্টইয়ে

2
এখানে কিছু ভুল আছে। পরিষেবাটি ব্রডকাস্ট রিসিভার থেকে কল করার কথা। তবে আপনি বলছেন যে আপনার পরিষেবাটি ব্রডকাস্ট রিসিভার এবং তারপরে আপনি আমাকে বলবেন যে পরিষেবা শ্রেণি সম্প্রচারের প্রাপককে প্রসারিত করে না। সুতরাং, এটি বুট সমাপ্ত সম্প্রচার গ্রহণ করবে না। আপনি অন-রিসিপ পদ্ধতিটি ঘোষণা করার সময় আপনি কী ওভাররাইড করছেন?
জোয়াকুইন ইয়ারচুক

0

প্রথমে আপনার ম্যাসিফেস্ট.এক্সএমএল ফাইলটিতে একটি রিসিভার নিবন্ধ করুন:

    <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আরও বা ওএসে পুনঃসূচনা করার জন্য <ওএস> ২৮ এই কোডটি ব্যবহার করুন কোটলিন সংস্করণ 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 বছরের উপরে অ্যাপসের জন্য জবশেডুলার চেক করুন

ওয়েকলক এটির জন্য সেরা বিকল্প ছিল তবে এটি এপিআই স্তরে অবতীর্ণ হয়েছে ২ P পিএলএস এই লিঙ্কটি পরীক্ষা করুন যদি আপনি ২i
https://developer.android.com/references/android/support/v4/content/WakefulBroadcastReceiver.html# startWakefulService (android.content.Context,% 20android.content.Intent)

এটা বলে

অ্যান্ড্রয়েড ও হিসাবে, ব্যাকগ্রাউন্ড চেক বিধিনিষেধগুলি এই শ্রেণিকে আর কার্যকর করে না। (ব্রডকাস্টের প্রাপ্তি থেকে কোনও পরিষেবা শুরু করা সাধারণত নিরাপদ নয়, কারণ আপনার অ্যাপ্লিকেশনটি এই মুহূর্তে অগ্রভাগে রয়েছে এবং সুতরাং এটি করার অনুমতি দেওয়া হয় না।) পরিবর্তে, বিকাশকারীদের অ্যান্ড্রয়েড ব্যবহার করা উচিত । app.job.JobScheduler একটি কাজের সময় নির্ধারণ করার জন্য, এবং এটি অ্যাপ্লিকেশনটি এমনটি করার সময় একটি ওয়েক লক ধরে রাখতে হবে না (সিস্টেমটি কাজের জন্য একটি ওয়েক লক ধরে রাখার যত্ন নেবে)।

সুতরাং এটি কোসাইডার জবশেডুলার বলেছে
https://developer.android.com/references/android/app/job/JobScheduler

এটি শুরু করা এবং চালিয়ে যাওয়া ছাড়া যদি কিছু করা হয় তবে আপনি সম্প্রচারটি ACTION_BOOT_COMPLETED পেতে পারেন

যদি এটি পূর্বগ্রন্থের বিষয়ে না হয় তবে কোনও অ্যাক্সেসিবিলিটি পরিষেবা করতে পারে কিনা তা পরীক্ষা করে দেখুন

অন্য বিকল্পটি হ'ল সম্প্রচারিত রিসিভার থেকে কোনও ক্রিয়াকলাপ শুরু করা এবং onCreate () এর মধ্যে পরিষেবা শুরু করার পরে এটি শেষ করা, যেহেতু নতুন অ্যান্ড্রয়েড সংস্করণগুলি রিসিভারগুলি থেকে পরিষেবা শুরু করার অনুমতি দেয় না

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.