শর্টকাট তৈরি করার পরে, আপনার অ্যাপের লাইফটাইম জুড়ে সেগুলি ম্যানেজ করতে হতে পারে। যেমন, আপনার শর্টকাট ব্যবহার করে ব্যবহারকারীরা কত ঘন ঘন নির্দিষ্ট অ্যাকশন সম্পূর্ণ করেন তা নির্ধারণ করে আপনি অ্যাপ অপ্টিমাইজ করতে চাইতে পারেন। অন্য একটি ক্ষেত্রে, আপনার অ্যাপ যাতে পুরনো বা অনুপস্থিত অ্যাকশন সম্পাদন না করে, তার জন্য আপনি পিন করা শর্টকাট বন্ধ করার সিদ্ধান্ত নিতে পারেন। কথোপকথনে উল্লেখ করা শর্টকাটের জন্য, আপনি হয়ত ব্যবহার ট্র্যাক করতে চাইবেন যাতে শর্টকাট র্যাঙ্কিং উন্নত করার জন্য সিগন্যাল প্রদান করা যায়।
এই পৃষ্ঠায় আপনার শর্টকাট ম্যানেজ করার জন্য এইগুলি এবং আরও কয়েকটি সাধারণ উপায় বর্ণনা করা হয়েছে।
শর্টকাট আচরণ
নিম্নলিখিত বিভাগে শর্টকাটের আচরণ সম্পর্কে সাধারণ তথ্য রয়েছে, যার মধ্যে দৃশ্যমানতা, ডিসপ্লে অর্ডার ও র্যাঙ্ক অন্তর্ভুক্ত।
শর্টকাটের দৃশ্যমানতা
ব্যবহারকারী নির্দিষ্ট কোনও জেসচার বা ভয়েস কমান্ড দিলে, কাজ করে এমন লঞ্চার বা অ্যাসিস্ট্যান্টে স্ট্যাটিক শর্টকাট ও ডায়নামিক শর্টকাট দেখা যায়। কাজ করে এমন লঞ্চারে, অ্যাপের লঞ্চার আইকন টাচ করে ধরে রাখার মাধ্যমে এই জেসচার কাজ করে, তবে অন্যান্য লঞ্চার অ্যাপে এই জেসচার আলাদা হতে পারে। Google Assistant-এর মাধ্যমে, Assistant-এর মধ্যে শর্টকাট দেখানো যেতে পারে অথবা ব্যবহারকারীর ভয়েস কমান্ডের মাধ্যমে চালু করা যেতে পারে।
LauncherApps ক্লাস লঞ্চার অ্যাপের জন্য শর্টকাট অ্যাক্সেস করার API প্রদান করে।
পিন করা শর্টকাট লঞ্চারে দেখা যায় বলে সেগুলি সবসময় দৃশ্যমান থাকে। শুধুমাত্র নিম্নলিখিত পরিস্থিতিতে লঞ্চার থেকে পিন করা শর্টকাট সরিয়ে দেওয়া হয়:
- ব্যবহারকারী এটি সরিয়ে দেন।
- শর্টকাটের সাথে যুক্ত অ্যাপ আনইনস্টল করা হয়েছে।
- ব্যবহারকারী সেটিংস > অ্যাপ ও বিজ্ঞপ্তি বিকল্পে গিয়ে, অ্যাপ বেছে নিয়ে, তারপর স্টোরেজ > স্টোরেজ মুছুন বিকল্পে ট্যাপ করে অ্যাপের ডেটা মুছে দেন।
শেয়ার টার্গেট হল ডায়নামিক শর্টকাটের সাবসেট যা Android শেয়ার শিটের সরাসরি শেয়ার করার সারিতে দেখা যায়।
শর্টকাট ডিসপ্লে করার ক্রম
লঞ্চার কোনও অ্যাপের শর্টকাট দেখালে, সেগুলি অবশ্যই নিম্নলিখিত ক্রমে দেখাতে হবে:
- স্ট্যাটিক শর্টকাট: শর্টকাট যার
isDeclaredInManifest()পদ্ধতিtrueরিটার্ন করে। - ডায়নামিক শর্টকাট: শর্টকাট যার
ShortcutInfo.isDynamic()মেথডtrueরিটার্ন করে।
প্রতিটি শর্টকাটের ধরন—স্ট্যাটিক ও ডায়নামিক—শর্টকাটগুলি ShortcutInfo.getRank অনুযায়ী
র্যাঙ্ক-এর ঊর্ধ্বক্রম অনুসারে সাজানো হয়। Google Assistant
ব্যবহারকারীদের দেখানোর জন্য প্রাসঙ্গিক শর্টকাট নির্ধারণ করার সময় শর্টকাট র্যাঙ্কও
বিবেচনা করে।
র্যাঙ্ক হল নেগেটিভ নয় এমন সিকোয়েন্সিয়াল পূর্ণসংখ্যা। স্ট্যাটিক শর্টকাটগুলি আপনার shortcuts.xml ফাইলে যেভাবে দেখানো হয় সেই অনুযায়ী প্রথম থেকে শেষ পর্যন্ত র্যাঙ্ক করা হয়। ডায়নামিক শর্টকাটের জন্য,
আপনি updateShortcuts(Context, List), addDynamicShortcuts(Context,
List), pushDynamicShortcut(Context, ShortcutInfoCompat) অথবা
setDynamicShortcuts(Context, List) কল করার সময় আগে থেকে থাকা শর্টকাটের র্যাঙ্ক আপডেট করতে পারবেন।
শেয়ার টার্গেটের ক্রম বিভিন্ন বিষয়ের উপর নির্ভর করে, যার মধ্যে আছে ব্যবহারকারীর পুরনো ইতিহাস, সাম্প্রতিকতা, ফ্রিকোয়েন্সি, র্যাঙ্ক হিন্ট, অ্যাপের ব্যবহার এবং শেয়ারিং শর্টকাটের সাথে
সম্পর্কিত কথোপকথনে সেট করা অগ্রাধিকার। Sharing Shortcuts API ব্যবহার করে তৈরি করা শেয়ার টার্গেটকে
ChooserTargetService-এর মাধ্যমে তৈরি করা শেয়ার টার্গেটের চেয়ে বেশি অগ্রাধিকার দেওয়া হয়,
যা Android 11-এ বন্ধ করে দেওয়া হয়েছে। Android 12 ও তার পরবর্তী ভার্সনে, বন্ধ হয়ে যাওয়া
ChooserTargetService-এর মাধ্যমে তৈরি করা শেয়ার টার্গেট আর শেয়ার শিটে দেখা যাবে না।
অধিকাংশ লঞ্চার সর্বাধিক চারটি শর্টকাট দেখায়। সংজ্ঞায়িত স্ট্যাটিক শর্টকাট ও ডায়নামিক শর্টকাটের যেকোনও কম্বিনেশনের জন্য, লঞ্চার সর্বাধিক দুটি স্ট্যাটিক শর্টকাট ও দুটি ডায়নামিক শর্টকাট দেখায়। যেমন, আপনি যদি চারটি স্ট্যাটিক শর্টকাট নির্ধারণ করেন এবং প্রোগ্রাম্যাটিকভাবে তিনটি ডায়নামিক শর্টকাট তৈরি করেন, তাহলে লঞ্চার প্রথম দুটি স্ট্যাটিক শর্টকাট এবং দুটি সবচেয়ে বেশি র্যাঙ্ক করা ডায়নামিক শর্টকাট দেখায়।
একাধিক ইনটেন্ট ও অ্যাক্টিভিটি ম্যানেজ করা
ব্যবহারকারী কোনও শর্টকাট অ্যাক্টিভেট করলে, আপনার অ্যাপ যাতে একাধিক অপারেশন করতে পারে, সেই জন্য আপনি এটিকে পরপর অ্যাক্টিভিটি ট্রিগার করার জন্য কনফিগার করতে পারেন। আপনি শর্টকাটের ধরনের উপর নির্ভর করে একাধিক ইনটেন্ট অ্যাসাইন করে, একটি অ্যাক্টিভিটি থেকে অন্যটি শুরু করে বা ইনটেন্ট ফ্ল্যাগ সেট করে এটি করতে পারেন।
একটি অ্যাক্টিভিটি থেকে অন্যটি শুরু করা
স্ট্যাটিক শর্টকাটে কাস্টম ইনটেন্ট ফ্ল্যাগ থাকতে পারবে না। স্ট্যাটিক শর্টকাটের প্রথম ইনটেন্টে সবসময়
Intent.FLAG_ACTIVITY_NEW_TASK এবং
Intent.FLAG_ACTIVITY_CLEAR_TASK সেট করা থাকে। এর অর্থ হল, আপনার অ্যাপ যখন
রান করছে, তখন স্ট্যাটিক শর্টকাট লঞ্চ করা হলে অ্যাপে আগে থেকে থাকা সব অ্যাক্টিভিটি
নষ্ট হয়ে যায়। আপনি যদি এই আচরণ না চান, তাহলে আপনি একটি ট্রাম্পোলিন
অ্যাক্টিভিটি ব্যবহার করতে পারেন—একটি অদৃশ্য অ্যাক্টিভিটি যা অন্য একটি অ্যাক্টিভিটি শুরু করে—একটি লঞ্চ ব্লকের ভিতরে
শেষ কল করে বা কম্পোজ কন্টেন্ট সেট করার আগে onCreate:
AndroidManifest.xml file-এ, ট্র্যাম্পোলিন অ্যাক্টিভিটিতেandroid:taskAffinity=""অ্যাট্রিবিউট অ্যাসাইনমেন্ট অন্তর্ভুক্ত করুন।শর্টকাট রিসোর্স ফাইলে, স্ট্যাটিক শর্টকাটের মধ্যে ইনটেন্টে ট্র্যাম্পোলিন অ্যাক্টিভিটি রেফারেন্স করুন।
ট্র্যাম্পোলিন অ্যাক্টিভিটি সম্পর্কে আরও তথ্যের জন্য, একটি অ্যাক্টিভিটি থেকে আরেকটি শুরু করা দেখুন।
ইনটেন্ট ফ্ল্যাগ সেট করুন
আপনি যেকোনও সেট Intent ফ্ল্যাগ সহ ডায়নামিক শর্টকাট প্রকাশ করতে পারবেন।
শর্টকাটের ইনটেন্টে Intent.FLAG_ACTIVITY_SINGLE_TOP এবং
Intent.FLAG_ACTIVITY_CLEAR_TOP-এর কম্বিনেশন উল্লেখ করলে ভালো হয়। এটি নিশ্চিত করে যে আপনার ComponentActivity আগে থেকেই অ্যাক্টিভ থাকলে, সেটি ফোরগ্রাউন্ডে আনা হয় এবং
নষ্ট না করে আবার ব্যবহার করা হয়, যার ফলে আপনার সিঙ্গেল-অ্যাক্টিভিটি আর্কিটেকচার
onNewIntent()-এর মাধ্যমে শর্টকাট ইভেন্ট সুন্দরভাবে ম্যানেজ করতে পারে।
টাস্ক ও ইনটেন্ট ফ্ল্যাগ সম্পর্কে আরও জানতে, টাস্ক ও ব্যাক স্ট্যাক দেখুন।
শর্টকাট আপডেট করুন
প্রতিটি অ্যাপের লঞ্চার আইকনে সর্বাধিক, স্ট্যাটিক ও ডায়নামিক শর্টকাটের সংখ্যা
একসাথে থাকতে পারে যা
getMaxShortcutCountPerActivity-এর মাধ্যমে রিটার্ন করা ভ্যালুর সমান। কোনও অ্যাপ কতগুলি পিন করা শর্টকাট তৈরি করতে পারবে তার কোনও সীমা নেই।
কোনও ডায়নামিক শর্টকাট পিন করা হলে, প্রকাশক সেটি ডায়নামিক শর্টকাট হিসেবে সরিয়ে দিলেও, পিন করা শর্টকাটটি এখনও দেখা যায় এবং চালু করা যায়। এটি কোনও অ্যাপকে
getMaxShortcutCountPerActivityটির বেশি শর্টকাট রাখার অনুমতি দেয়।
নিচের উদাহরণটি দেখুন, যেখানে ধরে নেওয়া হয়েছে যে getMaxShortcutCountPerActivity-এর রিটার্ন করা ভ্যালু হল 4:
- একটি চ্যাট অ্যাপ চারটি ডাইনামিক শর্টকাট প্রকাশ করে, যা চারটি সবচেয়ে সাম্প্রতিক কথোপকথন উপস্থাপন করে: c1, c2, c3 এবং c4।
- ব্যবহারকারী চারটি শর্টকাটের সবকটি পিন করেন।
- পরে, ব্যবহারকারী আরও তিনটি কথোপকথন শুরু করেন: c5, c6 এবং c7। প্রকাশক অ্যাপ তার ডায়নামিক শর্টকাট আবার প্রকাশ করে। নতুন ডায়নামিক শর্টকাট তালিকা হল: c4, c5, c6 এবং c7।
অ্যাপটিকে c1, c2 এবং c3 সরাতে হবে, কারণ এটি চারটির বেশি ডায়নামিক শর্টকাট দেখাতে পারে না। তবে, c1, c2 এবং c3 এখনও পিন করা শর্টকাট যা ব্যবহারকারী অ্যাক্সেস এবং লঞ্চ করতে পারবেন।
ব্যবহারকারী তখন মোট সাতটি শর্টকাট অ্যাক্সেস করতে পারবেন যা প্রকাশকের অ্যাপে অ্যাক্টিভিটির সাথে লিঙ্ক করে। এর কারণ হল, মোট সংখ্যার মধ্যে সর্বাধিক সংখ্যক শর্টকাট এবং তিনটি পিন করা শর্টকাট অন্তর্ভুক্ত থাকে।
- অ্যাপটি আগে থেকে থাকা সাতটি শর্টকাটের যেকোনও একটি আপডেট করতে
updateShortcuts(Context, List)ব্যবহার করতে পারে। যেমন, চ্যাট পিয়ারের আইকন পরিবর্তন হলে আপনি শর্টকাটের এই সেট আপডেট করতে পারেন। - আপনি
addDynamicShortcuts(Context, List)এবংsetDynamicShortcuts(Context, List)পদ্ধতি ব্যবহার করে একই আইডি সহ আগে থেকে থাকা শর্টকাট আপডেট করতে পারবেন। তবে, আপনি নন-ডায়নামিক, পিন করা শর্টকাট আপডেট করার জন্য এগুলি ব্যবহার করতে পারবেন না, কারণ এই দুটি পদ্ধতি শর্টকাটের প্রদত্ত তালিকাকে ডায়নামিক শর্টকাটে পরিবর্তন করার চেষ্টা করে।
Google Assistant-এর মতো অ্যাসিস্ট্যান্ট অ্যাপে দেখানোর জন্য যতগুলি খুশি শর্টকাট পুশ করা যেতে পারে। সহায়তা অ্যাপে ব্যবহার করার জন্য শর্টকাট তৈরি ও আপডেট করতে
ShortcutManagerCompat Jetpack লাইব্রেরির pushDynamicShortcut
পদ্ধতি ব্যবহার করুন। এছাড়াও, Google Assistant-এ ডায়নামিক লিঙ্ক দেখানোর জন্য আপনার অ্যাপে Google Shortcuts Integration
লাইব্রেরি যোগ করুন।
অ্যাপ শর্টকাট সংক্রান্ত নির্দেশিকা সম্পর্কে আরও জানতে, যার মধ্যে শর্টকাট আপডেট করাও অন্তর্ভুক্ত, শর্টকাটের জন্য পেশাদার পদ্ধতি দেখুন।
সিস্টেম লোকেলে হওয়া পরিবর্তন ম্যানেজ করুন
সিস্টেম লোকেলে পরিবর্তন হয়েছে তা বোঝাতে
Intent.ACTION_LOCALE_CHANGED ব্রডকাস্ট পেলে, অ্যাপকে অবশ্যই ডায়নামিক ও পিন করা শর্টকাট আপডেট করতে হবে।
শর্টকাটের ব্যবহার ট্র্যাক করা
কোন পরিস্থিতিতে স্ট্যাটিক ও ডায়নামিক শর্টকাট দেখানো হবে তা নির্ধারণ করতে,
লঞ্চার শর্টকাট অ্যাক্টিভেশনের ইতিহাস পরীক্ষা করে। স্ট্যাটিক শর্টকাটের জন্য,
আপনি reportShortcutUsed মেথড কল করে এবং নিম্নলিখিত ইভেন্টগুলির মধ্যে যেকোনও একটি ঘটলে
শর্টকাটের আইডি পাস করে, ব্যবহারকারীরা আপনার অ্যাপের মধ্যে কখন নির্দিষ্ট অ্যাকশন সম্পূর্ণ করেন তার ট্র্যাক রাখতে পারেন:
- ব্যবহারকারী প্রদত্ত আইডি সহ শর্টকাট বেছে নেন।
- অ্যাপের মধ্যে, ব্যবহারকারী ম্যানুয়ালি একই শর্টকাটের সাথে সম্পর্কিত অ্যাকশন সম্পূর্ণ করেন।
আপনার অ্যাপ pushDynamicShortcut
মেথড কল করে এবং প্রাসঙ্গিক ইভেন্ট ঘটলে শর্টকাটের আইডি পাস করে ডায়নামিক শর্টকাটের জন্য ব্যবহার ট্র্যাক করে।
এই পদ্ধতিতে ডায়নামিক শর্টকাট ব্যবহার করার সুবিধা পুশ করলে, Google Assistant-এর মতো অ্যাসিস্ট্যান্ট অ্যাপ
ব্যবহারকারীদের প্রাসঙ্গিক শর্টকাট সাজেস্ট করতে পারে। যেহেতু
pushDynamicShortcut পদ্ধতি কল করার সময় ব্যবহার সংক্রান্ত রিপোর্ট করে, তাই একই শর্টকাটের জন্য
reportShortcutUsed পদ্ধতি কল করবেন না।
কথোপকথন-সম্পর্কিত শর্টকাটের জন্য, আউটগোয়িং এবং ইনকামিং মেসেজের ব্যবহার ট্র্যাক করা গুরুত্বপূর্ণ। বিস্তারিত জানতে, লোকজন ও কথোপকথনের জন্য পেশাদার পদ্ধতি দেখুন।
শর্টকাট বন্ধ করুন
আপনার অ্যাপ ও এর ব্যবহারকারীরা ডিভাইসের লঞ্চারে শর্টকাট পিন করতে পারেন বলে, এইসব পিন করা শর্টকাট ব্যবহারকারীদের আপনার অ্যাপের মধ্যে এমন অ্যাকশনে নিয়ে যেতে পারে
যা পুরনো হয়ে গেছে বা আর নেই। এই পরিস্থিতি ম্যানেজ করতে, আপনি
disableShortcuts কল করে সেইসব শর্টকাট বন্ধ করে দিতে পারেন যেগুলি আপনি চান না যে ব্যবহারকারী বেছে নিন।
এটি স্ট্যাটিক ও ডায়নামিক শর্টকাটের তালিকা থেকে নির্দিষ্ট শর্টকাট সরিয়ে দেয় এবং
এইসব শর্টকাটের পিন করা কপি বন্ধ করে দেয়। আপনি
এই পদ্ধতির একটি ওভারলোড করা ভার্সনও ব্যবহার করতে পারেন যা কাস্টম ত্রুটি মেসেজ হিসেবে
CharSequence গ্রহণ করে। ব্যবহারকারী কোনও বন্ধ করা শর্টকাট চালু করার চেষ্টা করলে
এই সমস্যার মেসেজ দেখানো হয়।
রেট লিমিটিং
setDynamicShortcuts, addDynamicShortcuts বা updateShortcuts পদ্ধতি ব্যবহার করার সময়,
আপনি হয়ত ব্যাকগ্রাউন্ড অ্যাপে —যে অ্যাপের কোনও অ্যাক্টিভিটি বা পরিষেবা ফোরগ্রাউন্ডে নেই—
এই পদ্ধতিগুলি নির্দিষ্ট সংখ্যক বার কল করতে পারবেন।
আপনি নির্দিষ্ট সংখ্যক বার এইসব পদ্ধতি কল করতে পারেন, এই সীমাকেই
রেট লিমিটিং বলা হয়। এই ফিচার ShortcutManagerCompat-কে ডিভাইসের রিসোর্স
অতিরিক্ত ব্যবহার করা থেকে আটকায়।
রেট লিমিটিং অ্যাক্টিভ থাকলে, isRateLimitingActive ট্রু রিটার্ন করে।
তবে, নির্দিষ্ট কিছু ইভেন্টের সময় রেট লিমিট রিসেট করা হয়, তাই ব্যাকগ্রাউন্ড অ্যাপও
রেট লিমিট আবার না পৌঁছানো পর্যন্ত ShortcutManager মেথড কল করতে পারে। এইসব
ইভেন্টের মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত:
- কোনও অ্যাপ ফোরগ্রাউন্ডে আসে।
- সিস্টেম লোকেল পরিবর্তন হয়।
- ব্যবহারকারী কোনও বিজ্ঞপ্তিতে ইনলাইন উত্তর অ্যাকশন পারফর্ম করেন।
ডেভেলপমেন্ট বা টেস্টিংয়ের সময় রেট লিমিট সংক্রান্ত সমস্যার সম্মুখীন হলে, আপনি ডিভাইসের
সেটিংস থেকে ডেভেলপার বিকল্প > ShortcutManager রেট-লিমিটিং রিসেট করুন বিকল্প বেছে নিতে পারেন অথবা adb-এ নিম্নলিখিত কমান্ড লিখতে পারেন:
adb shell cmd shortcut reset-throttling [ --user your-user-id ]
ব্যাক-আপ ও ফিরিয়ে আনা
আপনার অ্যাপের ম্যানিফেস্ট ফাইলে android:allowBackup="true" অ্যাট্রিবিউট অ্যাসাইনমেন্ট অন্তর্ভুক্ত করে, ডিভাইস পরিবর্তন করার সময়
ব্যবহারকারীদের আপনার অ্যাপে ব্যাক-আপ ও রিস্টোর অপারেশন করার অনুমতি দিতে পারেন। আপনি ব্যাক-আপ ও ফিরিয়ে আনার সুবিধা দিলে, অ্যাপ শর্টকাট সম্পর্কে নিম্নলিখিত পয়েন্টগুলি মনে রাখবেন:
- স্ট্যাটিক শর্টকাট অটোমেটিক আবার প্রকাশ করা হয়, তবে ব্যবহারকারী নতুন ডিভাইসে আপনার অ্যাপ আবার ইনস্টল করার পরেই তা করা হয়।
- ডায়নামিক শর্টকাটের ব্যাক-আপ নেওয়া হয় না, তাই ব্যবহারকারী নতুন ডিভাইসে আপনার অ্যাপ খুললে সেগুলি আবার প্রকাশ করার জন্য আপনার অ্যাপে লজিক অন্তর্ভুক্ত করুন।
- পিন করা শর্টকাট ডিভাইসের লঞ্চারে অটোমেটিক রিস্টোর করা হয়, তবে পিন করা শর্টকাটের সাথে যুক্ত আইকন সিস্টেম ব্যাক-আপ নেয় না। তাই, আপনার অ্যাপে পিন করা শর্টকাটের ছবি সেভ করুন যাতে নতুন ডিভাইসে সেগুলি দ্রুত রিস্টোর করা যায়।
নিম্নলিখিত কোড স্নিপেট থেকে জানতে পারবেন যে কীভাবে আপনার অ্যাপের ডায়নামিক শর্টকাট সবচেয়ে ভালোভাবে ফিরিয়ে আনবেন এবং আপনার অ্যাপের পিন করা শর্টকাট সুরক্ষিত আছে কিনা তা কীভাবে চেক করবেন:
class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (ShortcutManagerCompat.getDynamicShortcuts(this).isEmpty()) { // Application restored. Re-publish dynamic shortcuts. if (ShortcutManagerCompat.getShortcuts(this, ShortcutManagerCompat.FLAG_MATCH_PINNED).isNotEmpty()) { // Pinned shortcuts are restored. Use updateShortcuts() to make // sure they contain up-to-date information. } } } // ... }