উত্তর:
প্রথমত, আপনার এতে অনুমতি দরকার AndroidManifest.xml
:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
এছাড়াও, আপনার মধ্যে AndroidManifest.xml
, আপনার পরিষেবাটি সংজ্ঞায়িত করুন এবং BOOT_COMPLETED ক্রিয়াটি শুনুন :
<service android:name=".MyService" android:label="My Service">
<intent-filter>
<action android:name="com.myapp.MyService" />
</intent-filter>
</service>
<receiver
android:name=".receiver.StartMyServiceAtBootReceiver"
android:label="StartMyServiceAtBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
তারপরে আপনাকে রিসিভারটি সংজ্ঞায়িত করতে হবে যা BOOT_COMPLETED ক্রিয়া পাবে এবং আপনার পরিষেবা শুরু করবে ।
public class StartMyServiceAtBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
Intent serviceIntent = new Intent(context, MyService.class);
context.startService(serviceIntent);
}
}
}
এবং এখন ফোনটি শুরু হয়ে গেলে আপনার পরিষেবাটি চলমান উচিত।
Intent.ACTION_BOOT_COMPLETED
আপনার রিসিভারের স্ট্রিংটিকে হার্ড-কোডিংয়ের পরিবর্তে ব্যবহার করা ভাল । Intent(context, MySystemService.class)
ইন্টেন্ট তৈরি করার সময় নতুন কনস্ট্রাক্টর ব্যবহার করা উচিত ।
Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own file
উপর public class
লাইন। কোন ধারনা?
অ্যান্ড্রয়েড ডিভাইস পুনরায় বুট করার পরে কীভাবে কোনও ক্রিয়াকলাপ চালানো শুরু করবেন:
উপাদানটির মধ্যে (উপাদানটির মধ্যে নয় ) আপনার AndroidManifest.xml
ফাইলে এই কোডটি সন্নিবেশ করুন :<application>
<activity>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver
android:enabled="true"
android:exported="true"
android:name="yourpackage.yourActivityRunOnStartup"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
তারপরে একটি নতুন শ্রেণি তৈরি করুন yourActivityRunOnStartup
( ম্যানিফেস্টে উপাদানটির android:name
জন্য নির্দিষ্ট মেলা <receiver>
):
package yourpackage;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class yourActivityRunOnStartup extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
Intent i = new Intent(context, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
}
দ্রষ্টব্য: কলটি i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
গুরুত্বপূর্ণ কারণ ক্রিয়াকলাপটি কার্যকলাপের বাইরে একটি প্রসঙ্গ থেকে শুরু করা হয়েছিল। এটি ছাড়া ক্রিয়াকলাপ শুরু হবে না।
এছাড়াও, মান android:enabled
, android:exported
এবং android:permission
মধ্যে <receiver>
ট্যাগটি বাধ্যতামূলক মনে হচ্ছে না। অ্যাপ্লিকেশনটি এই মানগুলি ছাড়াই ইভেন্টটি গ্রহণ করে। উদাহরণ এখানে দেখুন ।
Application
? ভিতরে হতে পারে onCreate()
?
onReceive()
একটি এরBroadcastReceiver
ACTION_BOOT_COMPLETE শুনুন এবং সেখান থেকে আপনার যা করা দরকার তা করুন। এখানে একটি কোড স্নিপেট আছে।
হালনাগাদ:
উত্তরের মূল লিঙ্কটি নিচে, সুতরাং মন্তব্যের উপর ভিত্তি করে, এখানে কোডটি লিঙ্কযুক্ত, কারণ লিঙ্কগুলি নিচে থাকার সময় কেউ কখনই কোডটি মিস করবে না।
AndroidManLive.xML (অ্যাপ্লিকেশন অংশ) এ:
<receiver android:enabled="true" android:name=".BootUpReceiver"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
...
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
...
public class BootUpReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, MyActivity.class); //MyActivity can be anything which you want to start on bootup...
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
শুরুতে অ্যান্ড্রয়েড অ্যাপ্লিকেশন চালু করতে আপনি কোডটি পরিবর্তন করতে না চাইলে অটোস্টার্টের মতো অ্যাপ্লিকেশনটি ব্যবহার করতে পারেন: অটোস্টার্ট - কোনও মূল নেই
শানের সমাধান আমার পক্ষে প্রাথমিকভাবে কার্যকর হয়নি (অ্যান্ড্রয়েড ৪.২.২)। আমাকে একই অ্যান্ড্রয়েড প্রকল্পে একটি ডামি ক্রিয়াকলাপ যোগ করতে হয়েছিল এবং ডিভাইসে ম্যানুয়ালি ক্রিয়াকলাপটি কমপক্ষে একবার চালাতে হয়েছিল। এরপরে শানের সমাধানটি কাজ শুরু করে এবং ব্রডকাস্টারসিভারকে পরবর্তী পুনরায় বুট করার পরে অবহিত করা হয়েছিল।
আমি এই প্রশ্নের মধ্যে একটি পয়েন্ট যোগ করতে চাই যা আমি বেশ কয়েকদিন ধরে মুখর ছিলাম। আমি সমস্ত উত্তর চেষ্টা করেছিলাম কিন্তু সেগুলি আমার পক্ষে কাজ করে না। আপনি যদি অ্যান্ড্রয়েড সংস্করণ 5.1 ব্যবহার করেন তবে দয়া করে এই সেটিংসটি পরিবর্তন করুন।
যদি আপনি অ্যান্ড্রয়েড সংস্করণ 5.1 ব্যবহার করেন তবে আপনাকে অ্যাপ্লিকেশন সেটিংস থেকে ডিস-সিলেক্ট করতে হবে (লঞ্চ করতে সীমাবদ্ধ)।
সেটিংস> অ্যাপ্লিকেশন> আপনার অ্যাপ্লিকেশন> লঞ্চ করতে সীমাবদ্ধ করুন (নির্বাচন না করা)
বুট প্রক্রিয়া চলাকালীন ধীরগতি এড়ানোর android.intent.action.USER_PRESENT
পরিবর্তে আরেকটি পদ্ধতি ব্যবহার করা android.intent.action.BOOT_COMPLETED
। তবে এটি কেবলমাত্র true
যদি ব্যবহারকারী লক স্ক্রিনটি সক্ষম করে থাকে - অন্যথায় এই অভিপ্রায়টি কখনই সম্প্রচারিত হয় না।
রেফারেন্স ব্লগ - অ্যান্ড্রয়েডের ACTION_USER_PRESENT ইন্টেন্ট সহ সমস্যা