যদি অ্যান্ড্রয়েড পরিষেবা একাধিকবার শুরু হয় তবে কী হবে?


120

আমার যদি নিম্নলিখিত কোড থাকে:

Intent intent = new Intent(this,DownloadService.class);     
for(int i=0;i<filesArray.length;i++){        
     startService(intent);          
}

এই কোড DownloadServiceপ্রসারিত IntentService

সুতরাং এখন যখন আমি কল করছি startService(intent)তার অর্থ এই যে আমি প্রতিবারই একটি নতুন পরিষেবা শুরু করি startService(intent)যা বলা হয় বা তার অর্থ কি এটি DownloadServiceএকবার চালানো হয় এবং তারপরে যতবার আমি কল startService(intent)করি তখনই এটি একটি ভিন্ন স্টার্টইড দিয়ে আলাদা উদ্দেশ্যটি পাস করবে।

এটি কী বোঝায় এবং এর মধ্যে কোনটি একটি?

উত্তর:


167

পরিষেবাটি কেবলমাত্র একটি ইভেন্টে চলবে। যাইহোক, আপনি যখনই পরিষেবাটি শুরু করেন, তখন onStartCommand()পদ্ধতিটি বলা হয়।

এটি এখানে নথিভুক্ত করা হয়


1
ধন্যবাদ। এটি সেখানেও বলেছে: "স্টার্ট সার্ভিস () পদ্ধতিটি তত্ক্ষণাত্ ফিরে আসে এবং অ্যান্ড্রয়েড সিস্টেম পরিষেবাটির অন স্টার্টকমন্ড () পদ্ধতিটি কল করে the সুতরাং যদি পরিষেবাটি ইতিমধ্যে চালু রয়েছে তবে সিস্টেমটি অনক্রিট () পদ্ধতিটি এড়িয়ে স্টার্টকমন্ড () কেবল কল করবে বা কী?
বাইটবিস্কুট

আমি সত্যিই জানি না, তবে আমি নিশ্চিত যে সে ক্ষেত্রে এটিই রয়েছে ( onCreate()পরিষেবাটি ইতিমধ্যে তৈরি করা থাকলে কল না করার জন্য প্রচুর পরিমাণে ধারণা তৈরি করে)। আপনি যদি Log.i()উভয় কলব্যাকগুলিতে একটি রেখে এবং লগগ্যাট চেক করেন তবে তা নির্ধারণ করা সহজ হওয়া উচিত ।
ফিলিপ ওয়েন্ড্ট

কেবল এটিই করেছিলেন ... এবং আশ্চর্যরকমভাবে এটি শেষ স্টার্ট সার্ভিস () কলের পরে অনক্রিট শুরু করে !!!
বাইটবিস্কুট

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

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

21

একেবারে সঠিক. অ্যাপ্লিকেশন প্রক্রিয়ার জন্য পরিষেবার কেবলমাত্র একটি উদাহরণ তৈরি করা হয়েছে। এবং আপনি যখন StartService();আবার কল করেন, তখন কেবল কল হয় onStartCommand()এবং নতুন ইনটেন্টটি পদ্ধতিতে পাস হয় onStartCommand()

দ্রষ্টব্য: onCreate() আবার বলা হয় না।

bindService()একাধিকবার কল করার বিষয়ে :

আপনি যখন bindService()একাধিকবার কল করেন , তারপরে আবার কেবলমাত্র পরিষেবাটির জন্য একটি উদাহরণ ব্যবহার করা হয় এবং অ্যান্ড্রয়েড রানটাইম ক্লায়েন্টকে একই আইবিন্ডার অবজেক্ট প্রদান করে।

মানে, onBind()একাধিকবার বলা হয় না। এবং কেবল ক্যাশেড আইবিন্দার অবজেক্টটি ফিরে আসবে।


না onStop()যে সংশ্লিষ্ট জন্য ডাকা হবে onStartCommand?
ইগোরগানাপলস্কি

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

8

উপরে উত্তর যা অন্যদের জন্য সহায়ক হতে পারে আরো কিছু তথ্য জোড়া যে, startIdযে onStartCommand()পদ্ধতি গ্রহণ করে যে জন্য ভিন্ন startService()কল।

এছাড়াও যদি আমরা উপরে উল্লিখিত হিসাবে লুপের জন্য লিখি, এতে লিখিত কোড onHandleIntent()লুপ ফ্রিকোয়েন্সি দ্বারা সংজ্ঞায়িত হিসাবে বহুবার কার্যকর করা হবে, তবে ক্রমানুসারে এবং সমান্তরালে নয়।

ধারণাটি IntentServiceএকটি কাজের সারি তৈরি করে এবং প্রতিটি অনুরোধটি startService()ট্রিগার করার জন্য অনুরোধ করে onStartCommand()যা ফলস্বরূপ কাজের কাতারে উদ্দেশ্যটি সংরক্ষণ করে এবং তারপরে একে একে উদ্দেশ্যটি পাস করে onHandleIntent()


2

ডক অনুসারে :

স্টার্ট সার্ভিস () পদ্ধতিটি তত্ক্ষণাত্ ফিরে আসে এবং অ্যান্ড্রয়েড সিস্টেম পরিষেবাটির অন স্টার্টকম্যান্ড () পদ্ধতিটিকে কল করে। যদি পরিষেবাটি ইতিমধ্যে চালু না থাকে, সিস্টেমটি প্রথমে অনক্রিট () কল করে এবং তারপরে এটি স্টার্টকমন্ড () কল করে।

এবং

পরিষেবাটি চালু করার জন্য একাধিক অনুরোধগুলি পরিষেবার অনস্টার্টকমন্ডে () একাধিক সম্পর্কিত কলগুলিতে ফল দেয়। তবে পরিষেবাটি বন্ধ করার জন্য কেবলমাত্র একটি অনুরোধ (স্টপসেলফ () বা স্টপ সার্ভিস () সহ এটি বন্ধ করতে হবে।

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