মাল্টি-ইউজার-সচেতন অ্যাপ তৈরি করা

যখন একটি ডিভাইস একাধিক ব্যবহারকারীকে সমর্থন করে, তখন এর অ্যাপগুলিকে অবশ্যই এই স্বতন্ত্র ব্যবহারকারীদের সম্পর্কে সচেতন করতে হবে।

কিছু অ্যাপের কিছু উপাদান সিঙ্গলটন হিসাবে চালানো দরকার এবং যেকোন ব্যবহারকারীর কাছ থেকে অনুরোধ গ্রহণ করতে পারে। শুধুমাত্র সিস্টেম অ্যাপই বর্তমানে এই বৈশিষ্ট্যটি ব্যবহার করতে পারে।

এই সুবিধা:

  • সম্পদ সংরক্ষণ করে
  • ব্যবহারকারীদের মধ্যে এক বা একাধিক ভাগ করা সংস্থান মধ্যস্থতা করে
  • একটি একক সার্ভার সংযোগ ব্যবহার করে নেটওয়ার্ক ওভারহেড হ্রাস করে

একাধিক ব্যবহারকারীর সাথে অনুমতি প্রবাহের চিত্রের জন্য নীচের চিত্রটি দেখুন।

একাধিক ব্যবহারকারীর অনুমতি প্রবাহ

চিত্র 1. একাধিক ব্যবহারকারীর অনুমতি

একটি সিঙ্গলটন কম্পোনেন্ট সক্রিয় করা হচ্ছে

একটি অ্যাপ্লিকেশানকে সিঙ্গলটন হিসাবে চিহ্নিত করতে, Android ম্যানিফেস্টে আপনার পরিষেবা, রিসিভার বা প্রদানকারীতে android:singleUser="true" যোগ করুন।

সিস্টেমটি শুধুমাত্র ব্যবহারকারী 0 হিসাবে চলমান প্রক্রিয়াটিতে সেই উপাদানটিকে ইনস্ট্যান্টিয়েট করবে। যেকোন ব্যবহারকারীর কাছ থেকে সেই প্রদানকারী বা পরিষেবার সাথে সংযোগ করার জন্য বা সেই রিসিভারের সাথে সম্প্রচার করার জন্য যেকোন অনুরোধ ব্যবহারকারী 0-তে প্রক্রিয়াটিতে রুট করা হবে। যদি এটি আপনার অ্যাপের একমাত্র উপাদান হয়, তবে আপনার অ্যাপের শুধুমাত্র একটি উদাহরণ চলবে।

আপনার প্যাকেজের ক্রিয়াকলাপগুলি এখনও প্রতিটি ব্যবহারকারীর জন্য একটি পৃথক প্রক্রিয়ায় চালু করা হবে, UID সেই ব্যবহারকারীর জন্য UID পরিসরে থাকবে (যেমন 1010034)।

ব্যবহারকারীদের সাথে মিথস্ক্রিয়া

অনুমতি সেট করুন

এই অনুমতি প্রয়োজন

INTERACT_ACROSS_USERS (signature|system)
INTERACT_ACROSS_USERS_FULL (signature)

এপিআই নিয়োগ করুন

অ্যাপ্লিকেশানগুলিকে একাধিক ব্যবহারকারীদের সম্পর্কে সচেতন করতে নিম্নলিখিত APIগুলি ব্যবহার করুন৷

  1. ইনকামিং বাইন্ডার কল থেকে ব্যবহারকারীর হ্যান্ডেল বের করুন:
    • int userHandle = UserHandle.getCallingUserId()
  2. একটি নির্দিষ্ট ব্যবহারকারীর পরিষেবা, কার্যকলাপ, সম্প্রচার শুরু করতে নতুন, সুরক্ষিত API ব্যবহার করুন:
    • Context.startActivityAsUser(Intent, UserHandle)
    • Context.bindServiceAsUser(Intent, …, UserHandle)
    • Context.sendBroadcastAsUser(Intent, … , UserHandle)
    • Context.startServiceAsUser(Intent, …, UserHandle)
    UserHandle একটি স্পষ্ট ব্যবহারকারী বা বিশেষ হ্যান্ডেলগুলির একটি হতে পারে: UserHandle.CURRENT বা UserHandle.ALLCURRENT সেই ব্যবহারকারীকে নির্দেশ করে যেটি বর্তমানে অগ্রভাগে রয়েছে। আপনি যখন সমস্ত ব্যবহারকারীদের কাছে একটি সম্প্রচার পাঠাতে চান তখন ALL ব্যবহার করুন৷
  3. আপনার নিজের অ্যাপের উপাদানগুলির সাথে যোগাযোগ করুন: (INTERACT_ACROSS_USERS) বা অন্যান্য অ্যাপের উপাদানগুলির সাথে: (INTERACT_ACROSS_USERS_FULL)
  4. আপনাকে প্রক্সি উপাদান তৈরি করতে হতে পারে যা ব্যবহারকারীর প্রক্রিয়ায় চলে যা ব্যবহারকারী 0-এ singleUser উপাদান অ্যাক্সেস করে।
  5. নতুন UserManager সিস্টেম পরিষেবার সাথে ব্যবহারকারীদের এবং তাদের হ্যান্ডেলগুলিকে জিজ্ঞাসা করুন:
    • UserManager.getUsers()
    • UserManager.getUserInfo()
    • UserManager.supportsMultipleUsers()
    • UserManager.getUserSerialNumber(int userHandle) - একটি নন-রিসাইকেল নম্বর যা ব্যবহারকারীর হ্যান্ডেলের সাথে মিলে যায়।
    • UserManager.getUserHandle(int serialNumber)
    • UserManager.getUserProfiles() - নিজের এবং পরিচালিত প্রোফাইলের সংগ্রহ ফেরত দেয়, যদি থাকে।
  6. নির্দিষ্ট বা সমস্ত ব্যবহারকারীর কথা শোনার জন্য নিবন্ধন করুন এবং ContentObserver, PackageMonitor, BroadcastReceiver-এ নতুন API-এর সাথে কলব্যাক করুন যা কোন ব্যবহারকারী কলব্যাক করেছে সে সম্পর্কে অতিরিক্ত তথ্য প্রদান করে।

একাধিক ব্যবহারকারী বা প্রোফাইলে পরিষেবা

সমস্ত পরিষেবার অন্য ব্যবহারকারী বা কাজের প্রোফাইলে একটি উদাহরণ চালানোর প্রয়োজন হয় না। যদি আপনার সিস্টেম পরিষেবাটিকে শুধুমাত্র ব্যবহারকারী 0 হিসাবে চালানোর প্রয়োজন হয় তবে সংস্থানগুলি সংরক্ষণে সহায়তা করার জন্য অন্যান্য ব্যবহারকারীদের অধীনে চলাকালীন পরিষেবাটির উপাদানগুলি অক্ষম করুন৷ নিম্নলিখিত উদাহরণটি দেখায় যে আপনি কীভাবে আপনার পরিষেবার এন্ট্রি পয়েন্টগুলিতে এটি করতে পারেন:

// Add on all entry points such as boot_completed or other manifest-listed receivers and providers
if (!UserManager.isSystemUser()) {
    // Disable the service
    ComponentName targetServiceName = new ComponentName(this, TargetService.class);
    context.getPackageManager().setComponentEnabledSetting(
        targetServiceName, COMPONENT_ENABLED_STATE_DISABLED, 0);
}

উদাহরণটি সম্পূর্ণ অ্যাপটিকে নিষ্ক্রিয় করতে PackageManager.setApplicationEnabledSetting() ব্যবহার করতে পারে।