অ্যাপ হাইবারনেশন

আপনার অ্যাপ Android 11 (API লেভেল ৩০) বা তার পরবর্তী ভার্সনকে টার্গেট করলে এবং ব্যবহারকারী কয়েক মাস ধরে আপনার অ্যাপের সাথে ইন্টার‍্যাক্ট না করলে, সিস্টেম আপনার অ্যাপকে হাইবারনেশন স্টেটে রেখে দেয়। সিস্টেম পারফর্ম্যান্সের পরিবর্তে স্টোরেজ স্পেসের জন্য অপ্টিমাইজ করে এবং সিস্টেম ব্যবহারকারীর ডেটা সুরক্ষিত রাখে। এই সিস্টেমের আচরণ ব্যবহারকারী সিস্টেম সেটিংস থেকে ম্যানুয়ালি আপনার অ্যাপ জোর করে বন্ধ করলে যা ঘটে তার মতোই।

হাইবারনেশনের প্রভাব

সারণী ১-এ যেমন দেখানো হয়েছে, হাইবারনেশনের প্রভাব আপনার অ্যাপের টার্গেট SDK ভার্সন এবং যে ডিভাইসে আপনার অ্যাপ চলছে তার উপর নির্ভর করে:

টেবিল ১. আপনার অ্যাপ হাইবারনেট করার প্রভাব
টার্গেট SDK ভার্সন ডিভাইসের বৈশিষ্ট্য হাইবারনেশন এফেক্ট
Android 12 বা তার পরবর্তী যেকোনও ভার্সন Android 12 বা তার পরবর্তী যেকোনও ভার্সনে চলে

আপনার অ্যাপের রানটাইম অনুমতি রিসেট করা হয়েছে। এই অ্যাকশনের প্রভাব ঠিক একই রকম হবে, যদি ব্যবহারকারী সিস্টেম সেটিংসে কোনও অনুমতি দেখেন এবং আপনার অ্যাপের অ্যাক্সেস লেভেল পরিবর্তন করে প্রত্যাখ্যান করুন বিকল্পে সেট করেন।

আপনার অ্যাপ ব্যাকগ্রাউন্ড থেকে কোনও কাজ বা অ্যালার্ট চালাতে পারবে না।

আপনার অ্যাপ পুশ বিজ্ঞপ্তি রিসিভ করতে পারবে না, এর মধ্যে Firebase Cloud Messaging-এর মাধ্যমে পাঠানো উচ্চ-অগ্রাধিকারের মেসেজও অন্তর্ভুক্ত।

আপনার অ্যাপের ক্যাশে-তে থাকা যেকোনও ফাইল সরিয়ে দেওয়া হয়।

Android ১১ Android 11-এ চলে আপনার অ্যাপের রানটাইম অনুমতি রিসেট করা হয়েছে।
Android ১১ Android 6.0 (API লেভেল ২৩) থেকে Android 10 (API লেভেল ২৯) পর্যন্ত ভার্সনে চলে, এবং Google Play পরিষেবা দ্বারা পরিচালিত

আপনার অ্যাপের রানটাইম অনুমতি রিসেট করা হয়েছে।

এই আচরণ ডিসেম্বর ২০২১ থেকে কার্যকর হবে। আরও কোটি কোটি ডিভাইসে অনুমতি অটোমেটিক-রিসেট করার সুবিধা উপলভ্য করা সম্পর্কে এই ব্লগ পোস্ট থেকে আরও জানুন।

কোনও অ্যাপ হাইবারনেশন থেকে বেরিয়ে এলে সিস্টেমের আচরণ

ব্যবহারকারী পরবর্তী সময়ে আপনার অ্যাপের সাথে ইন্টার‍্যাক্ট করলে, আপনার অ্যাপ হাইবারনেশন থেকে বেরিয়ে আসে এবং এটি আবার কাজ, অ্যালার্ট ও বিজ্ঞপ্তি তৈরি করতে পারে।

তবে, সিস্টেম আপনার অ্যাপের জন্য নিম্নলিখিত কাজ করে না:

  1. আপনার অ্যাপের রানটাইম অনুমতি আবার দিন।

    ব্যবহারকারীকে আপনার অ্যাপের জন্য এইসব অনুমতি আবার দিতে হবে।

  2. আপনার অ্যাপ হাইবারনেশনে যাওয়ার আগে শিডিউল করা যেকোনও কাজ, সতর্কতা এবং বিজ্ঞপ্তি রিশিডিউল করুন।

    এই ওয়ার্কফ্লো আরও সহজে সাপোর্ট করতে, WorkManager ব্যবহার করুন। এছাড়াও, আপনি ACTION_BOOT_COMPLETED সম্প্রচার রিসিভারে রিশিডিউল করার লজিক যোগ করতে পারেন, যা আপনার অ্যাপ হাইবারনেশন থেকে বেরিয়ে আসার পরে এবং ডিভাইস বুট হওয়ার পরে চালু হয়।

অ্যাপের ব্যবহার

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

অ্যাপ ব্যবহারের উদাহরণ

আপনার অ্যাপে কোনও অ্যাক্টিভিটি আবার শুরু হলে, সিস্টেম এই ইভেন্টকে ব্যবহারকারীর ইন্টার‍্যাকশন হিসেবে বিবেচনা করে। তাই, আপনার অ্যাপ হাইবারনেশনে প্রবেশ করার আগে সিস্টেম সময় বাড়িয়ে দেয়।

Android ১১ ও তার পরবর্তী ভার্সনে, নিম্নলিখিত আচরণগুলিও ব্যবহারকারীর ইন্টার‍্যাকশন হিসেবে বিবেচনা করা হয়:

  • ব্যবহারকারী উইজেট-এর সাথে ইন্টার‍্যাক্ট করেন।
  • ব্যবহারকারী কোনও বিজ্ঞপ্তির সাথে ইন্টার‍্যাক্ট করেন, তবে বিজ্ঞপ্তি বাতিল করার ক্ষেত্রে এটি প্রযোজ্য নয়।

মনে রাখবেন যে হাইবারনেশনের জন্য অ্যাপ ব্যবহার করার ক্ষেত্রে ব্যবহারকারীর ইন্টার‍্যাকশনের প্রয়োজন হয় না। প্যাকেজের কোনও কম্পোনেন্ট চালু করা হলে, সেটি এখনও অ্যাপের ব্যবহার হিসেবে বিবেচনা করা হয়। এর কিছু উদাহরণের মধ্যে এগুলি পড়ে:

  • এমন অ্যাপ যার পরিষেবা বা কন্টেন্ট প্রোভাইডার ডিভাইসের অন্য অ্যাপ বা OS-এর সাথে বাউন্ড করা আছে। যেমন, ইনপুট মেথড এডিটর (IME) বা পাসওয়ার্ড ম্যানেজার।
  • প্যাকেজে থাকা ব্রডকাস্ট রিসিভার এক্সটার্নাল প্যাকেজ থেকে এক্সপ্লিসিট ব্রডকাস্ট রিসিভ করছে।

উদাহরণ নয়

আপনার অ্যাপ যদি নিম্নলিখিত তালিকায় উল্লেখ করা আচরণই শুধু দেখায়, তাহলে কয়েক মাস পরে আপনার অ্যাপ হাইবারনেশন মোডে চলে যায়:

হাইবারনেশন থেকে সিস্টেমের অব্যাহতি

Android নির্দিষ্ট কিছু ব্যবহারের ক্ষেত্রে অ্যাপ হাইবারনেশন থেকে সিস্টেম-লেভেল ছাড় দেয়। আপনার অ্যাপ নিম্নলিখিত কোনও একটি বিভাগের মধ্যে পড়লে, সেটি অ্যাপ ব্যবহারের স্ট্যান্ডার্ড থেকে ছাড় পাবে এবং হাইবারনেট হবে না।

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

হাইবারনেশন থেকে ব্যবহারকারীর অব্যাহতি

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

  • পরিবারের সদস্যদের লোকেশন নির্দিষ্ট সময় অন্তর রিপোর্ট করে পরিবারের নিরাপত্তা নিশ্চিত করা।
  • কোনও ডিভাইস ও আপনার অ্যাপের সার্ভারের মধ্যে ডেটা সিঙ্ক করা।
  • টিভির মতো স্মার্ট ডিভাইসের সাথে যোগাযোগ করা।
  • স্মার্টওয়াচের মতো কম্প্যানিয়ন ডিভাইসের সাথে পেয়ার করুন।

ছাড়ের জন্য অনুরোধ করতে, নিম্নলিখিত বিভাগে উল্লেখ করা ধাপগুলি সম্পূর্ণ করুন।

ব্যবহারকারী আপনার অ্যাপের জন্য হাইবারনেশন আগে থেকেই বন্ধ করে রেখেছেন কিনা তা চেক করুন

ব্যবহারকারী আপনার অ্যাপের জন্য হাইবারনেশন আগেই বন্ধ করে দিয়েছেন কিনা তা চেক করতে, getUnusedAppRestrictionsStatus() API ব্যবহার করুন।

আপনার অ্যাপে এই API কীভাবে ব্যবহার করবেন সেই সম্পর্কে অতিরিক্ত বিবরণের জন্য, এই পৃষ্ঠায় API কোডের উদাহরণ দেখুন।

ব্যবহারকারীকে আপনার অ্যাপের জন্য হাইবারনেশন বন্ধ করতে বলুন

ব্যবহারকারী যদি আপনার অ্যাপের জন্য হাইবারনেশন আগে থেকে বন্ধ না করে থাকেন, তাহলে আপনি ব্যবহারকারীকে একটি অনুরোধ পাঠাতে পারেন। এটি করতে, এইসব ধাপ সম্পূর্ণ করুন:

  1. এমন একটি UI দেখান যা ব্যবহারকারীকে ব্যাখ্যা করে যে কেন তাকে আপনার অ্যাপের জন্য হাইবারনেশন বন্ধ করতে হবে।
  2. API কোডের উদাহরণে যেমন দেখানো হয়েছে, সেইভাবে createManageUnusedAppRestrictionsIntent() API কল করুন। এই API একটি ইনটেন্ট তৈরি করে যা সেটিংসে অ্যাপের তথ্য স্ক্রিন লোড করে। এখান থেকে, ব্যবহারকারী আপনার অ্যাপের জন্য হাইবারনেশন বন্ধ করতে পারবেন।

    এই ইনটেন্ট পাঠানোর সময় startActivity()-কে নয়, startActivityForResult()-কে কল করা গুরুত্বপূর্ণ।

    সারণী ২-এ যেমন দেখানো হয়েছে, বিকল্পের লোকেশন ও নাম নির্ভর করে যে ডিভাইসে আপনার অ্যাপ ইনস্টল করা আছে তার বৈশিষ্ট্যের উপর:

    সারণী ২. আপনার অ্যাপের জন্য হাইবারনেশন বন্ধ করার বিকল্প
    ডিভাইসের বৈশিষ্ট্য যে পৃষ্ঠায় বিকল্পটি দেখা যায় বন্ধ করার বিকল্পের নাম
    Android 13 বা তার পরবর্তী যেকোনও ভার্সনে চলে অ্যাপের তথ্য ব্যবহার না করা হলে অ্যাপ অ্যাক্টিভিটি পজ করুন
    Android 12-এ চলে অ্যাপের তথ্য অনুমতি সরিয়ে দিন ও স্পেস খালি করুন
    Android 11-এ চলে অ্যাপ সম্পর্কিত তথ্য > অনুমতি অ্যাপ ব্যবহার না করা হলে অনুমতি সরিয়ে দিন
    Android 6.0 থেকে Android 10 পর্যন্ত যেকোনও ভার্সনে চলে এবং Google Play পরিষেবা দ্বারা পরিচালিত Play অ্যাপ > মেনু > Play Protect > অব্যবহৃত অ্যাপের জন্য অনুমতি অ্যাপ ব্যবহার না করা হলে অনুমতি সরিয়ে দিন

API কোডের উদাহরণ

আপনার অ্যাপের জন্য হাইবারনেশন চালু করা আছে কিনা তা কীভাবে চেক করবেন এবং আপনার অ্যাপের জন্য হাইবারনেশন বন্ধ করতে ব্যবহারকারীদের জিজ্ঞাসা করার সঠিক উপায় এই কোডের উদাহরণে দেখানো হয়েছে।

Kotlin

val future: ListenableFuture<Int> =
    PackageManagerCompat.getUnusedAppRestrictionsStatus(context)
future.addListener({ onResult(future.get()) }, ContextCompat.getMainExecutor(context))

fun onResult(appRestrictionsStatus: Int) {
  when (appRestrictionsStatus) {
    // Couldn't fetch status. Check logs for details.
    ERROR -> { }

    // Restrictions don't apply to your app on this device.
    FEATURE_NOT_AVAILABLE -> { }

    // The user has disabled restrictions for your app.
    DISABLED -> { }

    // If the user doesn't start your app for a few months, the system will
    // place restrictions on it. See the API_* constants for details.
    API_30_BACKPORT, API_30, API_31 -> handleRestrictions(appRestrictionsStatus)
  }
}

fun handleRestrictions(appRestrictionsStatus: Int) {
  // If your app works primarily in the background, you can ask the user
  // to disable these restrictions. Check if you have already asked the
  // user to disable these restrictions. If not, you can show a message to
  // the user explaining why permission auto-reset or app hibernation should be
  // disabled. Then, redirect the user to the page in system settings where they
  // can disable the feature.
  val intent = IntentCompat.createManageUnusedAppRestrictionsIntent(context, packageName)

  // You must use startActivityForResult(), not startActivity(), even if
  // you don't use the result code returned in onActivityResult().
  startActivityForResult(intent, REQUEST_CODE)
}

পুরনো প্ল্যাটফর্ম API

এছাড়াও, অপারেটিং সিস্টেমে হাইবারনেশন ফিচারের সাথে ইন্টার‍্যাক্ট করার জন্য একটি API অন্তর্ভুক্ত থাকে। তবে, API শুধুমাত্র Android 11 বা তার পরবর্তী ভার্সনে কাজ করে; API হাইবারনেশন ফিচার ম্যানেজ করে না যা আগের Android ভার্সনে ব্যাকপোর্ট করা হয়েছে। তাই, আমরা API ব্যবহার করার সাজেশন দিই না।

মানানসই হওয়ার জন্য আপনাকে সাময়িকভাবে API ব্যবহার করা চালিয়ে যেতে হলে, নিম্নলিখিত তালিকা থেকে কীভাবে এটি ব্যবহার করতে হয় তা জানতে পারবেন:

  • আপনার অ্যাপের জন্য হাইবারনেশন বন্ধ করা আছে কিনা তা চেক করতে: isAutoRevokeWhitelisted()
  • ব্যবহারকারীকে হাইবারনেশন সেটিংস পৃষ্ঠায় পাঠাতে: ACTION_APPLICATION_DETAILS_SETTINGS ব্যবহার করে একটি ইনটেন্ট তৈরি করুন

হাইবারনেশন আচরণ ম্যানুয়ালি চালু করুন

সিস্টেম আপনার অ্যাপকে হাইবারনেশন স্টেটে রাখার পরে আপনার অ্যাপ কীভাবে কাজ করে তা পরীক্ষা করতে, নিম্নলিখিত ধাপগুলি সম্পূর্ণ করুন:

  1. (শুধুমাত্র Android 12 ও তার পরবর্তী যেকোনও ভার্সনে) আপনার ডিভাইসে হাইবারনেশন আচরণ চালু করুন:

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. সিস্টেম হাইবারনেশনে যাওয়ার আগে ডিফল্ট হিসেবে কতক্ষণ অপেক্ষা করবে তা সেট করুন। এইভাবে, আপনি পরীক্ষা করার পরে এটি ফিরিয়ে আনতে পারবেন:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. সিস্টেম যত সময় অপেক্ষা করে তা কমিয়ে দিন। নিচের উদাহরণে, সিস্টেমটি এমনভাবে পরিবর্তন করা হয়েছে যাতে আপনি অ্যাপের সাথে ইন্টার‍্যাক্ট করা বন্ধ করার মাত্র এক সেকেন্ড পরে আপনার অ্যাপ হাইবারনেশনে প্রবেশ করে:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. নিম্নলিখিত কমান্ড রান করে আপনার টেস্ট ডিভাইসে বুট-টাইম ব্রডকাস্ট শেষ হওয়ার জন্য অপেক্ষা করুন:

    adb shell am wait-for-broadcast-idle
    

    ব্রডকাস্ট শেষ হলে, এই কমান্ড মেসেজটি ফিরিয়ে দেয়: All broadcast queues are idle!

  5. অ্যাপ হাইবারনেশন প্রসেস ম্যানুয়ালি চালু করুন:

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (শুধুমাত্র Android 12 ও তার পরবর্তী যেকোনও ভার্সনের জন্য) নিম্নলিখিত পদ্ধতিগুলির মধ্যে একটি ব্যবহার করে, অ্যাপটি হাইবারনেট করা হয়েছে কিনা তা কনফার্ম করুন:

    • লক্ষ্য করুন যে টেস্ট ডিভাইসে এখন একটি বিজ্ঞপ্তি দেখাচ্ছে, যা ইঙ্গিত করে যে অব্যবহৃত অ্যাপ হাইবারনেট করা হয়েছে।
    • এই কমান্ড রান করুন:

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. সিস্টেম আপনার অ্যাপ হাইবারনেশনে রাখার আগে ডিফল্ট সময় ফিরিয়ে আনুন:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold