android - যবহ - স্মার্টফোনে




অ্যান্ড্রয়েড বুট একটি সেবা শুরু করার চেষ্টা করছেন (11)

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

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

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

Andro আইডি

<receiver
    android:name=".StartServiceAtBootReceiver"
    android:enabled="true"
    android:exported="false"
    android:label="StartServiceAtBootReceiver" >
    <intent-filter>
        <action android:name="android.intent.action._BOOT_COMPLETED" />
    </intent-filter>
</receiver>

<service
    android:name="com.test.RunService"
    android:enabled="true" />

সম্প্রচার গ্রহনকারী যন্ত্র

public void onReceive(Context context, Intent intent) {
    if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
        Intent serviceLauncher = new Intent(context, RunService.class);
        context.startService(serviceLauncher);
        Log.v("TEST", "Service loaded at start");
    }
}

অতিরিক্ত তথ্য হিসাবে: বাহ্যিক সঞ্চয়স্থান মাউন্ট হওয়ার আগে BOOT_COMPLETE অ্যাপ্লিকেশনগুলিতে পাঠানো হয়। সুতরাং যদি বাইরের সঞ্চয়স্থানে ইনস্টল করা হয় তবে এটি BOOT_COMPLETE সম্প্রচার বার্তা পাবেন না।

here আরও বিস্তারিত বিভাগ ব্রডকাস্ট রিসিভারে "বুট সম্পন্ন" শোনাচ্ছে


আপনি যদি অ্যানড্রইড স্টুডিও ব্যবহার করেন এবং আপনি স্বতঃপূর্ণ হওয়ার খুব পছন্দের হন তবে আপনাকে অবশ্যই জানাতে হবে, আমি Android স্টুডিও v 1.1.0 ব্যবহার করছি এবং আমি নিম্নলিখিত অনুমতির জন্য স্বতঃপূর্ণ ব্যবহার করেছি

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

এবং অ্যান্ড্রয়েড স্টুডিওটি স্বতঃ-ক্ষেত্রে RECEIVE_BOOT_COMPLETED সম্পন্ন হয়েছে RECEIVE_BOOT_COMPLETED এবং আমি আমার চুল টেনে তুলতে থাকি কারণ RECEIVE_BOOT_COMPLETED পরিষেবাটি শুরু করার জন্য আমি RECEIVE_BOOT_COMPLETED আমার চেকলিস্টটি ইতিমধ্যে করতে চাই। আমি শুধু আবার নিশ্চিত

অ্যান্ড্রয়েড স্টুডিও নিম্ন-ক্ষেত্রে এই অনুমতিটি স্বয়ংক্রিয়ভাবে সম্পন্ন করে।


আমি আপনার ম্যানিফেস্ট যোগ করার প্রয়োজন মনে হয়:

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

আমি রিসিভার ক্লাসে খালি কন্সট্রাক্টর রেখে গেলে এই সমস্যার মুখোমুখি হই। অপসারণের পরে খালি কনসট্রাক্টর উপর রেসিভেভ মেথো জরিমানা কাজ শুরু।


আসলে, আমি অনেক আগেই এই সমস্যার মধ্যে পড়েছি এবং এটি সত্যিই ঠিক করা সহজ, যদি আপনি "android.intent.action.BOOT_COMPLETED" অনুমতি এবং অভিপ্রায়-ফিল্টারটি সেটআপ করেন তবে আপনি কোনও ভুল করবেন না।

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


এই আমি কি কি

1. আমি রিসিভার ক্লাস তৈরি

public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //whatever you want to do on boot
       Intent serviceIntent = new Intent(context, YourService.class);
       context.startService(serviceIntent);
    }
}

২ .২1 ম্যানিফেস্ট

<manifest...>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <application...>
        <receiver android:name=".BootReceiver" android:enabled="true" android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    ...

3. এবং আপনার মুখ্য অ্যাক্টিভিটিতে রিসিভারটি "সেট" করার প্রয়োজন হলে, এটি অনক্রিপ্টের ভিতরে হতে পারে

...
 final ComponentName onBootReceiver = new ComponentName(getApplication().getPackageName(), BootReceiver.class.getName());
        if(getPackageManager().getComponentEnabledSetting(onBootReceiver) != PackageManager.COMPONENT_ENABLED_STATE_ENABLED)
        getPackageManager().setComponentEnabledSetting(onBootReceiver,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);
...

আমি চূড়ান্ত steap আমি ApiDemos থেকে শিখেছি



বহিরাগত সঞ্চয়স্থান মাউন্ট করার আগে BOOT_COMPLETE চালানো হয়। আপনার অ্যাপ্লিকেশন বহিরাগত সঞ্চয়স্থানে ইনস্টল করা হলে এটি BOOT_COMPLETE সম্প্রচার বার্তা পাবেন না। এটি প্রতিরোধ করতে আপনি অভ্যন্তরীণ সঞ্চয়স্থানে আপনার অ্যাপ্লিকেশনটি ইনস্টল করতে পারেন। আপনি শুধু menifest.xml এই লাইন যোগ করতে পারেন

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="internalOnly"
... >

কিছু HTC ডিভাইস একটি "দ্রুত বুট" বৈশিষ্ট্যটি সক্ষম করতে পারে যা একটি গভীর হাইবারনেশন এবং একটি বাস্তব রিবুট নয় এবং তাই BOOT_COMPLETE অভিপ্রায়টি দিতে পারে না। এটি পুনরুদ্ধার করতে আপনি আপনার রিসিভারের ভিতরে এই অভিপ্রায় ফিল্টার যুক্ত করতে পারেন:

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

মনে রাখবেন যে প্রশ্নটির শুরুতে টাইপ ভুল আছে:

<action android:name="android.intent.action._BOOT_COMPLETED"/>

পরিবর্তে :

<action android:name="android.intent.action.BOOT_COMPLETED"/>

এক ছোট "_" এবং এই সব সমস্যা :)


Settings > Fast Boot বিকল্পের কারণে এটি এখন পাওয়া গেছে

যখন আমার এই বিকল্পটি বন্ধ থাকে, তখন আমার অ্যাপ্লিকেশনটি এই সম্প্রচারটি পায় তবে অন্যথায় নয়।

যাইহোক, আমি Android 2.3.3 HTC Incredible S উপর আছে।

আশা করি এটা সাহায্য করবে.





android-service