android - পেতে অ্যাপ্লিকেশন() বনাম পেতে অ্যাপ্লিকেশন Context()
android-activity android-service (3)
আমি Context.getApplicationContext()
একটি সন্তোষজনক উত্তর খুঁজে পাইনি, তাই এখানে আমরা যাই: Activity/Service.getApplication()
Context.getApplicationContext()
এবং Context.getApplicationContext()
কী চুক্তি?
আমাদের আবেদন, উভয় একই বস্তু ফিরে। ActivityTestCase
তবে, অ্যাপ্লিকেশনটি getApplication()
করে অ্যাপ্লিকেশনটি getApplication()
সাথে ফিরে আসবে, তবে getApplicationContext
এখনও একটি ভিন্ন প্রসঙ্গ উদাহরণ (Android দ্বারা ইনজেকশনের) প্রদান করবে। যে একটি বাগ? এটা উদ্দেশ্য কি?
আমি এমনকি প্রথম স্থান পার্থক্য বুঝতে না। কোনও পরীক্ষার স্যুটের বাইরে এমন কোনও ঘটনা আছে যেখানে উভয় কল বিভিন্ন বস্তুর সাথে ফিরে আসতে পারে? কখন এবং কেন? তাছাড়া, কেন getApplication
Activity
এবং getApplication
সংজ্ঞায়িত করা হয় তবে Context
? কোথাও থেকে পাওয়া একটি বৈধ আবেদন দৃষ্টান্ত সবসময় হতে হবে না?
এটা প্রসঙ্গ মোড়ানো সঙ্গে কি আছে বলে মনে হয়। Context
থেকে প্রাপ্ত বেশিরভাগ ক্লাস আসলে একটি ContextWrapper
, যা মূলত মোড়কের পরিবর্তনের সাথে অন্য প্রসঙ্গে প্রতিনিধিত্ব করে।
প্রেক্ষাপটে একটি সাধারণ বিমূর্ততা যা মকিং এবং প্রক্সিং সমর্থন করে। যেহেতু বেশিরভাগ প্রসঙ্গগুলি Activity
মতো সীমিত-জীবনকালের বস্তুর সাথে আবদ্ধ, তাই ভবিষ্যতের বিজ্ঞপ্তিগুলির জন্য নিবন্ধীকরণের উদ্দেশ্যে দীর্ঘস্থায়ী প্রসঙ্গটি পেতে একটি উপায় থাকা দরকার। যে Context.getApplicationContext()
দ্বারা অর্জন করা হয়। একটি লজিক্যাল বাস্তবায়ন গ্লোবাল Application
অবজেক্টটি ফেরত দেওয়ার জন্য, তবে কোনও উপযুক্ত প্রয়োগের সাথে একটি রেপার বা প্রক্সি ফেরত দেওয়ার প্রসঙ্গে বাস্তবায়নকে বাধা দেয় না।
ক্রিয়াকলাপ এবং পরিষেবাদি আরো বিশেষভাবে একটি Application
বস্তুর সাথে যুক্ত করা হয়। এর ব্যবহারযোগ্যতা, আমি বিশ্বাস করি, আপনি ম্যানিফেস্টে Application
থেকে প্রাপ্ত একটি কাস্টম ক্লাস তৈরি করতে এবং নিবন্ধন করতে পারেন এবং নিশ্চিত হতে পারেন যে Activity.getApplication()
বা Service.getApplication()
নির্দিষ্ট ধরণের যে নির্দিষ্ট বস্তুটি ফেরত দেবে আপনি আপনার প্রাপ্ত Application
ক্লাসে নিক্ষেপ করতে পারেন এবং যেকোনো কাস্টম উদ্দেশ্যে ব্যবহার করতে পারেন।
অন্য কথায়, getApplication()
Application
অবজেক্টটি ফেরত দেওয়ার নিশ্চয়তা দেওয়া হয়, যখন getApplicationContext()
পরিবর্তে একটি প্রক্সি ফেরত দিতে বিনামূল্যে থাকে।
খুব আকর্ষণীয় প্রশ্ন। আমি মনে করি এটি মূলত একটি অর্থার্থিক অর্থ, এবং ঐতিহাসিক কারণেও হতে পারে।
যদিও বর্তমান অ্যান্ড্রয়েড ক্রিয়াকলাপ এবং পরিষেবা বাস্তবায়নে, getApplication()
এবং getApplicationContext()
একই বস্তুটি ফেরত দিচ্ছে, তবে এটি সর্বদা নিশ্চিত হবে যে এটি সবসময়ই হবে (উদাহরণস্বরূপ, একটি নির্দিষ্ট বিক্রেতার প্রয়োগে)।
তাই যদি আপনি ম্যানিফেস্টে নিবন্ধিত অ্যাপ্লিকেশন ক্লাসটি চান তবে আপনাকে কখনো অ্যাপ্লিকেশনটি getApplicationContext()
কল getApplicationContext()
কল করতে হবে না এবং এটি আপনার অ্যাপ্লিকেশনে getApplicationContext()
হবে না কারণ এটি অ্যাপ্লিকেশন উদাহরণ (যা আপনি অবশ্যই পরীক্ষার কাঠামোর সাথে স্পষ্টভাবে অভিজ্ঞ) হতে পারে না।
কেন getApplicationContext()
প্রথম স্থানে বিদ্যমান?
getApplication()
শুধুমাত্র অ্যাক্টিভেশন ক্লাস এবং পরিষেবা শ্রেণিতে উপলব্ধ, যখন getApplicationContext()
কনটেক্সট ক্লাসে ঘোষণা করা হয়।
এটি আসলে একটি জিনিস: যখন একটি সম্প্রচারকারী রিসিভারে কোড লেখা হয়, যা একটি প্রসঙ্গ নয় তবে এটির getApplicationContext()
পদ্ধতিতে একটি প্রসঙ্গ দেওয়া হয়, তবে আপনি শুধুমাত্র getApplicationContext()
কল করতে পারেন। যার মানে হল যে আপনি ব্রডকাস্ট রিসিভারে আপনার অ্যাপ্লিকেশন অ্যাক্সেস করার জন্য নিশ্চিত নন।
যখন অ্যান্ড্রয়েড কোডটি দেখছেন, তখন আপনি দেখেন যে যখন সংযুক্ত থাকে, একটি কার্যকলাপ একটি বেস প্রসঙ্গ এবং একটি অ্যাপ্লিকেশন পায়, এবং এটি বিভিন্ন পরামিতি। getApplicationContext()
এটির কলটি প্রতিনিধিত্ব করে।
একাধিক জিনিস: ডকুমেন্টেশন বলে যে এটি বেশিরভাগ ক্ষেত্রেই আপনাকে অ্যাপ্লিকেশন সাবক্লাস করতে হবে না:
Application
subclass সাধারণত প্রয়োজন নেই। বেশিরভাগ ক্ষেত্রে, স্থিতিশীল এককটি আরো মডুলার পদ্ধতিতে একই কার্যকারিতা সরবরাহ করতে পারে। যদি আপনার সিঙ্গল্টনকে গ্লোবাল প্রসঙ্গের প্রয়োজন হয় (উদাহরণস্বরূপ ব্রডকাস্ট রিসিভার নিবন্ধন করতে), এটি পুনরুদ্ধারের ফাংশনটিContext
দেওয়া যেতে পারে যা অভ্যন্তরীণভাবেContext
Context.getApplicationContext()
ব্যবহার করে যখনContext.getApplicationContext()
তৈরি করে।
আমি জানি এটি একটি সঠিক এবং সুনির্দিষ্ট উত্তর নয়, তবে তা এখনও আপনার প্রশ্নের উত্তর দেয়?
getApplication()
এবং getApplicationContext()
তুলনা করুন।
getApplication
Application
একটি Application
অবজেক্ট প্রদান করে যা আপনাকে আপনার বিশ্বব্যাপী অ্যাপ্লিকেশন অবস্থা পরিচালনা করতে এবং কিছু ডিভাইসের পরিস্থিতিতে প্রতিক্রিয়া জানায় যেমন onLowMemory()
এবং onConfigurationChanged()
।
getApplicationContext
বিশ্বব্যাপী অ্যাপ্লিকেশন প্রেক্ষাপটটি ফেরত দেয় - অন্য প্রসঙ্গগুলির থেকে পার্থক্য উদাহরণস্বরূপ, আপনার ক্রিয়াকলাপ শেষ হওয়ার পরে Android দ্বারা একটি কার্যকলাপের প্রসঙ্গটি (বা অন্যথায় অনুপলব্ধ করা যেতে পারে) ধ্বংস করা যেতে পারে। অ্যাপ্লিকেশন প্রেক্ষাপটে আপনার অ্যাপ্লিকেশন অবজেক্ট বিদ্যমান থাকলেও (যা একটি নির্দিষ্ট Activity
সংযুক্ত নয়) বিদ্যমান থাকে যাতে আপনি Notifications মতো জিনিসগুলির জন্য এটি ব্যবহার করতে পারেন যা একটি প্রেক্ষাপটের প্রয়োজন যা দীর্ঘ সময়ের জন্য উপলব্ধ এবং ক্ষণস্থায়ী UI অবজেক্টের জন্য উপলব্ধ থাকবে।
আমি মনে করি এটি আপনার কোডটি কী করছে তা নির্ভর করছে কিনা তা এইগুলি হতে পারে বা নাও হতে পারে - স্বাভাবিক ব্যবহারের ক্ষেত্রে, আমি তাদের ভিন্ন হতে চাই।