অ্যান্ড্রয়েড - বুটে সার্ভিস শুরু করুন


107

স্ট্যাক এক্সচেঞ্জ এবং অন্য কোথাও আমি যা দেখেছি তার থেকে, অ্যান্ড্রয়েড ওএস বুট হওয়ার পরে একটি ইনটেন্স সার্ভিস শুরু করার জন্য আমার সবকিছু ঠিকঠাকভাবে সেট আপ হয়েছে। দুর্ভাগ্যক্রমে এটি বুট থেকে শুরু হচ্ছে না এবং আমি কোনও ত্রুটি পাচ্ছি না। সম্ভবত বিশেষজ্ঞরা সাহায্য করতে পারেন ...

সুস্পষ্ট:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.phx.batterylogger"
  android:versionCode="1"
  android:versionName="1.0"
  android:installLocation="internalOnly">

<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BATTERY_STATS" />

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <service android:name=".BatteryLogger"/>
    <receiver android:name=".StartupIntentReceiver">  
        <intent-filter>  
            <action android:name="android.intent.action.BOOT_COMPLETED" />  
        </intent-filter>  
    </receiver>
</application>

</manifest>

প্রারম্ভের জন্য ব্রডকাস্টার রিসিভার:

package com.phx.batterylogger;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class StartupIntentReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent serviceIntent = new Intent(context, BatteryLogger.class);
        context.startService(serviceIntent);
    }
}

আপডেট : আমি নীচের সমস্ত পরামর্শের প্রায় চেষ্টা করেছি এবং আমি Log.v("BatteryLogger", "Got to onReceive, about to start service");স্টার্টআপসেন্টারসিভারের অন রিসিভ হ্যান্ডলারটিতে লগিং যুক্ত করেছি এবং কিছুই কখনও লগ হয় না। এটি এমনকি এটি ব্রডকাস্টার্সিভারেও তৈরি করে না।

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


1
আপনি কোন সমস্যা পাচ্ছেন, কোন ইউআই পাচ্ছেন না ..?
ললিত পপতানি

1
পরিষেবাটি কখনই শুরু হয় না, এটাই সমস্যা।
গাডি

আপনি কীভাবে জানতে পারলেন যে আপনার পরিষেবা শুরু হচ্ছে না, আপনি কি লগগুলি বা এর মতো কিছু মুদ্রণ করেছেন ..?
ললিত পপতানি

1
এটি চালিত হচ্ছে না এমন জন্য আপনার লগের দরকার নেই। অ্যান্ড্রয়েড ওএস চলমান পরিষেবাদি প্রকাশ করে। তবে কোনও ত্রুটি ঘটছে কিনা তা দেখার জন্য লগিং ব্যবহার করা বুদ্ধিমানের কাজ হবে। আমি একটি অনুমান করার চেষ্টা করব যে প্রসঙ্গটি দেখা দেওয়ার আগেই এটি ঘটে। স্টার্ট সার্ভিস () যদি কোনও ত্রুটি দেখা দেয়।
টনি

1
আমি Log.v("BatteryLogger", "Got to onReceive, about to start service");অন-রিসিভ হ্যান্ডলারটিতে যুক্ত করেছি এবং এটি কখনও লগগুলিতে প্রদর্শিত হয় না। সুতরাং শ্রোতা ব্যর্থ হচ্ছে (?)
গ্যাডি

উত্তর:


302

ভাল এখানে একটি অটোস্টার্ট অ্যাপ্লিকেশন একটি সম্পূর্ণ উদাহরণ

অ্যান্ড্রয়েডমেনিস্ট ফাইল

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="pack.saltriver" android:versionCode="1" android:versionName="1.0">

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

    <application android:icon="@drawable/icon" android:label="@string/app_name">

        <receiver android:name=".autostart">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <activity android:name=".hello"></activity>
        <service android:enabled="true" android:name=".service" />
    </application>
</manifest>

autostart.java

public class autostart extends BroadcastReceiver 
{
    public void onReceive(Context context, Intent arg1) 
    {
        Intent intent = new Intent(context,service.class);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            context.startForegroundService(intent);
        } else {
            context.startService(intent);
        }
        Log.i("Autostart", "started");
    }
}

service.java

public class service extends Service
{
    private static final String TAG = "MyService";
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    public void onDestroy() {
        Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onDestroy");
    }

    @Override
    public void onStart(Intent intent, int startid)
    {
        Intent intents = new Intent(getBaseContext(),hello.class);
        intents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intents);
        Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onStart");
    }
}

হ্যালো.জভা - একবার অ্যাপ্লিকেশনকে একবার চালানোর পরে আপনি যখন ডিভাইসটি শুরু করবেন তখন এটি পপ-আপ হবে।

public class hello extends Activity 
{   
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Toast.makeText(getBaseContext(), "Hello........", Toast.LENGTH_LONG).show();
    }
}

10
সম্পূর্ণ উদাহরণের জন্য +1। হতে পারে আমার হ্যান্ডলি ইন্টেন্টের সাহায্যে আমার ইনটেন্স সার্ভিসটি একটি সরল পুরানো পরিষেবাতে পরিবর্তন করা উচিত
গাডি

6
এটি শেষ পর্যন্ত সমাধান করেছে। সমস্যাটি ছিল আমার পরিষেবাটি সরল পুরাতন পরিষেবার পরিবর্তে ইনটেন্ট সার্ভিস এবং পরিষেবা কোডের ত্রুটির সংমিশ্রণ। এই উত্তরটির গভীরতা এবং অ্যান্ড্রয়েডে লগ ইন করা আমার সমস্যাগুলি সমাধান করতে সহায়তা করে।
গাডি

3
বিস্তারিত উদাহরণের জন্য +1। এটি কি কোনও কার্যকলাপ ছাড়াই কাজ করবে?
বালাস

1
অন ​​স্টার্ট () কলব্যাক হ্রাস করা হয়। পরিবর্তে আপনার স্টার্টকম্যান্ড () ব্যবহার করা উচিত।
এমএমবিএস

1
@ মিমবিএস এর উত্তরটি প্রায় 5 বছরের পুরানো, তাই এর সুস্পষ্ট
ললিত পপতানি

3

বুট করার পরে ডিভাইসটি ঘুমাতে যাওয়ার কারণে আপনার পরিষেবাটি সম্পূর্ণ হওয়ার আগে বন্ধ হয়ে যেতে পারে। আপনাকে প্রথমে একটি ওয়েক লক পাওয়া দরকার। ভাগ্যক্রমে, সমর্থন লাইব্রেরি আমাদের এটি করার জন্য একটি ক্লাস দেয় :

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" />

1
আমারও একই সমস্যা হচ্ছে। আপনি আমাকে সাহায্য করতে আপত্তি? ধন্যবাদ! stackoverflow.com/questions/35373525/starting-my-service
Ruchir Baronia

2

নিম্নলিখিত কাজ করা উচিত। আমি যাচাই করেছি। আপনার সমস্যা হতে পারে অন্য কোথাও।

public class MyReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("TAG", "MyReceiver");
        Intent serviceIntent = new Intent(context, Test1Service.class);
        context.startService(serviceIntent);
    }
}




public class Test1Service extends Service {
    /** Called when the activity is first created. */
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("TAG", "Service created.");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("TAG", "Service started.");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        Log.d("TAG", "Service started.");
    }
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
}




<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.test"
      android:versionCode="1"
      android:versionName="1.0"
      android:installLocation="internalOnly">
    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.BATTERY_STATS" 
    />
<!--        <activity android:name=".MyActivity">
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" /> 
                <category android:name="android.intent.category.LAUNCHER"></category> 
            </intent-filter>
       </activity> -->
        <service android:name=".Test1Service" 
                  android:label="@string/app_name"
                  >
        </service>
        <receiver android:name=".MyReceiver">  
            <intent-filter>  
                <action android:name="android.intent.action.BOOT_COMPLETED" /> 
            </intent-filter>  
        </receiver> 
    </application>
</manifest>

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

1
আপনার কোডটি এমুলেটরটিতে কাজ করছে? আপনি এমুলেটর মধ্যে অভিপ্রায় পেতে সক্ষম করতে পারেন?
বিবেক

আমি এমুলেটরটিতে পরীক্ষা করেছি এবং আমি ডিডিএমএসে একটি ত্রুটি পেয়েছি, তবে মনে হচ্ছে কমপক্ষে পরিষেবাটি শুরু করার চেষ্টা করা হচ্ছে, যদিও আমার কোনও Log()বক্তব্য সেখানে নেই এবং এমুলেটর ডিভাইসটি ওএস সেটিংসে চলমান হিসাবে আমার পরিষেবাটি দেখায় না। ডিডিএমএস-এ ত্রুটিটি এখানে রয়েছে: এর System.err - at com.phx.batterylogger$1.onReceive(BatteryLogger.java:43)অর্থ কী সমস্যাটি আমার ব্যাটারি লগার পরিষেবাটির 43 লাইনে রয়েছে?
গাডি

2

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

অ্যান্ড্রয়েডমেনিস্ট ফাইল

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="pack.saltriver" android:versionCode="1" android:versionName="1.0">
<uses-permission 
android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<application android:icon="@drawable/icon" android:label="@string/app_name">

<activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <receiver android:name=".UIBootReceiver" android:enabled="true" 
    android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>
     <service android:name=".class_Service" />
</application>

UIBootReceiver

public class UIBootReceiver extends BroadcastReceiver {

private static final String TAG = "UIBootReceiver";
@Override

    public void onReceive(Context context, Intent arg1)
    {
        Toast.makeText(context, "started", Toast.LENGTH_SHORT).show();
        Intent intent = new Intent(context,class_Service.class);
        context.startService(intent);
    }
  }

এটি এই অ্যাপ্লিকেশনের জন্য ব্যাটারি সঞ্চয় পরিচালনা করার প্রয়োজন নেই বলে অনুমতি চাইছে যাতে আপনি স্টাইলটি পটভূমিতে চালাতে পারেন।

মেইনএকটিভিটি ক্লাসের অনক্রিট () এ এই কোডটি ঘোষণা করুন:

   Intent myIntent = new Intent();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        myIntent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
        myIntent.setData(Uri.parse("package:" + 
   DeviceMovingSpeed.this.getPackageName()));
    }
    startActivity(myIntent);

1

খুব অনুরূপ খনি কিন্তু আমি রিসিভার জন্য পূর্ণ প্যাকেজের নাম ব্যবহার করে:

<receiver android:name=".StartupIntentReceiver">

আমার আছে:

<receiver android:name="com.your.package.AutoStart"> 

হ্যাঁ, আপনার সমস্যাটি বাছাই করা কিছুটা হলেও, তাই হ্যালো ওয়ার্ল্ড উদাহরণ পোস্ট করা আরও ভাল।
ললিত পপতানি

1

আমি পুরো প্যাকেজ ছাড়াই সাফল্য পেয়েছি, আপনি কি জানেন যে কল চেইন কোথায় বাধাগ্রস্থ হচ্ছে? আপনি যদি ডিবাগ করেLog() , কোন মুহুর্তে এটি আর কাজ করে না?

আমি মনে করি এটি আপনার ইনটেন্স সার্ভিসে থাকতে পারে, এটি সমস্ত ঠিক আছে।


আমি Log.v("BatteryLogger", "Got to onReceive, about to start service");অন-রিসিভ হ্যান্ডলারটিতে যুক্ত করেছি এবং এটি কখনও লগগুলিতে প্রদর্শিত হয় না। সুতরাং শ্রোতা ব্যর্থ হচ্ছে (?)
গ্যাডি

ফোন বুট হওয়ার পরে কী সম্প্রচারের রিসিভার শুরু করে? ধন্যবাদ!
রুচির বড়োনিয়া

বয়। আমি কয়েক বছরের মধ্যে অ্যান্ড্রয়েড স্পর্শ করি নি। দুঃখিত @Ruchir
Phix

0

মন্তব্যে উল্লিখিত হিসাবে অনুসন্ধান সহজতর করার জন্য, এটি ৩.১ https://stackoverflow.com/a/19856367/6505257 এর পর থেকে সম্ভব নয়


এটি ঠিক নয়, একবার হিসাবে একই উত্তর মন্তব্যের অংশে চিন্তাভাবনা দ্বিগুণ কোড লিখেছেন
রিকার্ডো এ।

আমার যুক্তি সমর্থন করার জন্য আরও বিশদ ব্যাখ্যা: stackoverflow.com/questions/20441308/…
রিকার্ডো এ।

আমি অ্যান্ড্রয়েডের সাথে যেহেতু কিছু করে আসছি তা সত্যই দীর্ঘকাল হয়েছে তবে আপনি ঠিক বলেছেন, এটি সম্ভব। অন্য কোন যুক্তি প্রয়োজন। (আমি উত্তরটি সম্পাদনা করব)
মিঃকিউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.