START_STICKY এবং START_NOT_STICKY


272

অ্যান্ড্রয়েডে পরিষেবাগুলি প্রয়োগ করার সময় START_STICKYএবং এর মধ্যে পার্থক্য কী START_NOT_STICKY? কেউ কি কিছু স্ট্যান্ডার্ড উদাহরণ দেখিয়ে দিতে পারে ..?

উত্তর:


371

উভয় কোড কেবল তখনই প্রাসঙ্গিক হয় যখন ফোনটি মেমরির বাইরে চলে যায় এবং কার্য সম্পাদন শেষ হওয়ার আগে পরিষেবাটি মেরে ফেলে। START_STICKYপর্যাপ্ত স্মৃতিশক্তি থাকার পরে ওএসকে পরিষেবাটি পুনরায় তৈরি করতে এবং onStartCommand()শূন্য অভিপ্রায় দিয়ে আবার কল করতে বলে । START_NOT_STICKYওএসকে আবার পরিষেবাটি পুনরুদ্ধার করতে বিরক্ত না করতে বলে। তৃতীয় START_REDELIVER_INTENTকোডও রয়েছে যা ওএসকে পরিষেবাটি পুনরায় তৈরি করতে এবং একই উদ্দেশ্যটি পুনরায় বিতরণ করতে বলে onStartCommand()

ডায়ান হ্যাকোবারের এই নিবন্ধটি অফিসিয়াল ডকুমেন্টেশনের চেয়ে এর ব্যাকগ্রাউন্ডটি ব্যাখ্যা করেছে।

সূত্র: http://android-developers.blogspot.com.au/2010/02/service-api-changes-starting-with.html

এখানে মূল অংশটি একটি নতুন ফলাফল কোডটি ফাংশন দ্বারা ফিরিয়ে দেওয়া হয়েছে, এটি প্রক্রিয়াটি চলমান অবস্থায় মারা গেলে যদি পরিষেবাটি কী করা উচিত তা সিস্টেমকে জানিয়ে দেয়:

START_STICKY মূলত পূর্বের আচরণের মতোই, যেখানে পরিষেবাটি "শুরু" করা বাকি রয়েছে এবং পরে এটি সিস্টেম দ্বারা পুনরায় চালু করা হবে। প্ল্যাটফর্মের পূর্ববর্তী সংস্করণগুলির মধ্যে একমাত্র পার্থক্য হ'ল এটি যদি এটি পুনরায় চালু হয় কারণ এটির প্রক্রিয়াটি নিহত হয়েছে, অন স্টার্টকমন্ড ()টিকে পরিষেবাটির পরবর্তী উদাহরণে একেবারেই ডাকা হবে না তার পরিবর্তে নাল ইন্টেন্ট সহ কল ​​করা হবে। যে পরিষেবাগুলি এই মোডটি ব্যবহার করে তাদের সর্বদা এই কেসটি পরীক্ষা করা উচিত এবং এটি যথাযথভাবে মোকাবেলা করা উচিত।

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

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


1
টাস্ক হ্যান্ডেলস্টার্টে ডাবল কলিং এড়াতে কীভাবে (অভিপ্রায়, স্টার্টআইডি); যেহেতু উভয়ই স্টার্ট () এবং অনস্টার্টকমন্ড বলা হবে? এটা কি ভাল ডিজাইন? @ ফ্র্যাঙ্ক লেইগ
সজ্জাদ হিসেইন খান

2
কোনওটি নির্দিষ্ট না করা থাকলেও ডিফল্ট পতাকাটি কী?
ইগোরগানাপলস্কি

3
আপনি যদি "রিটার্ন সুপার.স্টার্টকমন্ড (...)" অনুসরণ করেন; আপনি দেখতে পাবেন যে ক্ষেত্রে যদি আপনার টার্গেট এসডিকে সংস্করণটি ECLAIR (API5 = 2.0) এর চেয়ে কম হয় তবে ডিফল্টরূপে START_STICKY_COMPATIBILITY ফিরে আসে এবং 2.0 থেকে উপরে এবং START_STICKY ফিরে আসে।
মাইকেল

1
"কোনও অবশিষ্ট প্রারম্ভকালীন কমান্ড নেই" বলতে কী বোঝায় START_NOT_STICKY?
মালভিন্দর সিং

3
@FrankLeigh আমি সম্মত না যে START_REDELIVER_INTENTভালো হয় START_NOT_STICKY। পরিবর্তে এটি এর মতোSTART_STICKY
CopsOnRoad

107

KISS উত্তর

পার্থক্য:

START_STICKY

সিস্টেমটি আপনার পরিষেবাটি মারা যাওয়ার পরে পুনরায় তৈরি করার চেষ্টা করবে

START_NOT_STICKY

সিস্টেমটি আপনার পরিষেবাটি মারা যাওয়ার পরে পুনরায় তৈরি করার চেষ্টা করবে না


আদর্শ উদাহরণ:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

5
এটি আসলে সঠিক এবং বিভ্রান্তিকর নয়। এটি একটি ভুল বলেছে: "পরিষেবা নিহত হয়েছে" কারণ কেউ ভাবতে পারে যে আপনি স্টপসেলফ বা স্টপ সার্ভিসকে উল্লেখ করেছেন, যখন আপনি স্পষ্টভাবে নিহত প্রক্রিয়াটির উল্লেখ করছেন। সুতরাং আপনি আপনার উত্তরে শব্দ প্রক্রিয়াটি আরও ভালভাবে ব্যবহার করুন।
ইলিয়া গাজমান

হাই কিভাবে আমি পরীক্ষা করতে পারি START_REDELIVER_INTENT। আমি কেবল START_STICKYসাম্প্রতিক অ্যাপ্লিকেশন দ্বারা অ্যাপ্লিকেশনটি পরীক্ষা করেছি এবং হত্যা করেছি। তারপরে এটি পরিষেবাটি স্মরণ করুন। তবে START_REDELIVER_INTENTআর কখনও ডাকেনি। কেন?
আসিফ মোশতাক

ইলিয়াগজম্যান আমি শ্রদ্ধার সাথে একমত নই থামানো এবং নিহত হওয়া দুটি খুব আলাদা শব্দ। এই উত্তরটি সহজ এবং সোজা পদ্ধতিতে বিষয়টি সঠিকভাবে ব্যাখ্যা করে।
NoHarmDan

23

জন্য ডকুমেন্টেশন START_STICKYএবং START_NOT_STICKYবেশ সোজা।

START_STICKY:

যদি এই পরিষেবার প্রক্রিয়াটি শুরু হওয়ার সময় মারা যায় (এখান থেকে ফিরে আসার পরে onStartCommand(Intent, int, int))এটি শুরু অবস্থায় রেখে দিন তবে এই সরবরাহিত অভিপ্রায়টি ধরে রাখবেন না Later পরে সিস্টেমটি পরিষেবাটি পুনরায় তৈরি করার চেষ্টা করবে Because কারণ এটি শুরু হওয়া অবস্থায় রয়েছে) এটি onStartCommand(Intent, int, int) নতুন পরিষেবা ইনস্ট্যান্স তৈরির পরে কল করার গ্যারান্টি দিবে ; যদি পরিষেবাটিতে বিতরণ করার জন্য কোনও মুলতুবি সূচনা কমান্ড না থাকে তবে এটি একটি নাল অভিপ্রায় বস্তুর সাথে ডাকা হবে, সুতরাং আপনার এটি পরীক্ষা করার জন্য অবশ্যই যত্ন নেওয়া উচিত।

এই মোডটি এমন জিনিসগুলির জন্য অর্থবোধ করে যা স্পষ্টভাবে শুরু হবে এবং সময়ের নির্বিচারে সময়কালের জন্য চালানো বন্ধ হবে যেমন একটি পরিষেবা পরিবেশন করা ব্যাকগ্রাউন্ড মিউজিক প্লেব্যাক হিসাবে।

উদাহরণ: স্থানীয় পরিষেবা নমুনা

START_NOT_STICKY:

যদি এই পরিষেবাটির প্রক্রিয়াটি শুরু হওয়ার সময় মারা যায় (এখান থেকে ফিরে আসার পরে onStartCommand(Intent, int, int))এবং এটি সরবরাহ করার জন্য কোনও নতুন শুরুর উদ্দেশ্য নেই, তবে পরিষেবাটি শুরু হওয়া অবস্থায় বাইরে নিয়ে যান এবং ভবিষ্যতে কোনও স্পষ্ট কল না পাওয়া পর্যন্ত পুনরায় তৈরি করবেন না Context.startService(Intent)The onStartCommand(Intent, int, int)কোনও nullইন্টেন্টের সাথে কল পাবেন না কারণ বিতরণ করার মতো কোনও মুলতুবি ইন্টেন্ট না থাকলে এটি পুনরায় শুরু করা হবে না।

এই মোডটি সেই জিনিসগুলির জন্য অর্থবোধ করে যা শুরু করার ফলে কিছু কাজ করতে চায় তবে মেমরির চাপের মধ্যে থাকলে তা থামানো যেতে পারে এবং আরও কাজ করার জন্য স্পষ্টত আবার নিজেকে শুরু করবে। এই জাতীয় পরিষেবার একটি উদাহরণ হ'ল সার্ভারের ডেটাগুলির জন্য পোলগুলি: এটি Nঅ্যালার্মের পরিষেবাটি শুরু করে প্রতি মিনিটে পোলের জন্য একটি অ্যালার্ম নির্ধারণ করতে পারে । যখন এটিকে onStartCommand(Intent, int, int)অ্যালার্ম থেকে ডাকা হয়, এটি এন মিনিটের পরে একটি নতুন অ্যালার্মের সময়সূচী করে এবং এর নেটওয়ার্কিং করতে একটি থ্রেড তৈরি করে। যদি এই চেকটি করার সময় এটির প্রক্রিয়াটি মারা যায়, অ্যালার্মটি বন্ধ না হওয়া পর্যন্ত পরিষেবাটি আরম্ভ করা হবে না।

উদাহরণ: সার্ভিস স্টার্টআর্গমেন্টস.জভা


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

START_STICKY এবং START_NOT_STICKY এর জন্য স্টার্টকম্যান্ড () কেবল একবার কার্যকর করা হবে এবং এ থেকে বেরিয়ে আসবে। আপনি যে নমুনাটি দেখিয়েছেন তার মধ্য দিয়ে আমি গিয়েছিলাম, তবে আমার সন্দেহ হ'ল অন স্টার্টকমন্ড () কতবার কার্যকর করা হবে। যদি আমি START_STICKY পুনরায় চালু করি এবং এখনও পরিষেবাটি পুনরায় তৈরি করার চেষ্টা করি, তবে পরিষেবাটি কি স্টার্টকমন্ড কার্যকর করবে ??
প্রাগো

পরিষেবাটি পুনরায় তৈরি করা হলে ক্রিয়াকলাপের কী হবে? ক্রিয়াকলাপ কি আবারও তৈরি হয়?
আরশ

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