پیمایش برگشتی نحوه حرکت کاربران در تاریخچه صفحههایی است که قبلاً بازدید کردهاند. همه دستگاههای اندرویدی دکمه بازگشت را برای این نوع پیمایش ارائه میکنند، بنابراین نباید دکمه بازگشت را به رابط کاربری برنامه خود اضافه کنید. بسته به دستگاه اندرویدی کاربر، این دکمه ممکن است یک دکمه فیزیکی یا یک دکمه نرم افزاری باشد.
در حالی که کاربر در سرتاسر برنامه شما پیمایش می کند، اندروید یک دسته پشتی از مقصدها را حفظ می کند. این معمولاً به اندروید اجازه میدهد تا با فشار دادن دکمه برگشت به مقصدهای قبلی به درستی حرکت کند. با این حال، چند مورد وجود دارد که برنامه شما ممکن است برای ارائه بهترین تجربه کاربری ممکن نیاز به اجرای رفتار Back خود داشته باشد. برای مثال، هنگام استفاده از WebView
، ممکن است بخواهید رفتار پیشفرض دکمه بازگشت را لغو کنید تا به کاربر اجازه دهید به جای صفحههای قبلی در برنامه شما، در تاریخچه مرور وب خود به عقب برگردد.
پیاده سازی ناوبری برگشتی سفارشی
ComponentActivity
، کلاس پایه FragmentActivity
و AppCompatActivity
، به شما اجازه می دهد تا با استفاده از OnBackPressedDispatcher
، رفتار دکمه Back را کنترل کنید، که می توانید با فراخوانی getOnBackPressedDispatcher()
را بازیابی کنید.
OnBackPressedDispatcher
نحوه ارسال رویدادهای دکمه Back به یک یا چند شی OnBackPressedCallback
را کنترل می کند. سازنده برای OnBackPressedCallback
یک بولی برای حالت فعال اولیه می گیرد. تنها زمانی که یک callback فعال باشد (یعنی isEnabled()
true
را برمی گرداند) ارسال کننده با handleOnBackPressed()
callback تماس می گیرد تا رویداد دکمه برگشت را مدیریت کند. با فراخوانی setEnabled()
می توانید وضعیت فعال را تغییر دهید.
تماس ها از طریق روش های addCallback
اضافه می شوند. اکیداً توصیه می شود از متد addCallback()
استفاده کنید که LifecycleOwner
را می گیرد. این تضمین میکند که OnBackPressedCallback
فقط زمانی اضافه میشود که LifecycleOwner
Lifecycle.State.STARTED
باشد. این اکتیویتی همچنین زمانی که LifecycleOwner
مرتبط با آنها از بین میرود، تماسهای ثبتشده را حذف میکند، که از نشت حافظه جلوگیری میکند و آن را برای استفاده در قطعات یا سایر دارندگان چرخه حیات که طول عمر کمتری نسبت به فعالیت دارند، مناسب میسازد.
در اینجا نمونه ای از اجرای فراخوان آورده شده است:
کاتلین
class MyFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // This callback will only be called when MyFragment is at least Started. val callback = requireActivity().onBackPressedDispatcher.addCallback(this) { // Handle the back button event } // The callback can be enabled or disabled here or in the lambda } ... }
جاوا
public class MyFragment extends Fragment { @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // This callback will only be called when MyFragment is at least Started. OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) { @Override public void handleOnBackPressed() { // Handle the back button event } }; requireActivity().getOnBackPressedDispatcher().addCallback(this, callback); // The callback can be enabled or disabled here or in handleOnBackPressed() } ... }
میتوانید از طریق addCallback()
چندین تماس پاسخ دهید. هنگام انجام این کار، تماسهای برگشتی به ترتیب معکوسی که اضافه میشوند فراخوانی میشوند - پاسخ تماسی که آخرین بار اضافه شده است، اولین فرصتی است که به رویداد دکمه برگشت داده میشود. به عنوان مثال، اگر سه تماس با نام های one
، two
و three
را به ترتیب اضافه کنید، آنها به ترتیب به ترتیب three
، two
و one
فراخوانی می شوند.
پاسخ به تماس ها از الگوی زنجیره مسئولیت پیروی می کند. هر تماس برگشتی در زنجیره فقط در صورتی فراخوانی می شود که تماس قبلی فعال نشده باشد. این بدان معناست که در مثال قبل، callback two
فقط در صورتی فراخوانی می شود که callback three
فعال نباشد. Callback one
فقط در صورتی فراخوانی می شود که پاسخ تماس two
فعال نباشد و غیره.
توجه داشته باشید که وقتی از طریق addCallback()
اضافه میشود، تا زمانی که LifecycleOwner
وارد وضعیت Lifecycle.State.STARTED
نشود، پاسخ تماس به زنجیره مسئولیت اضافه نمیشود.
تغییر وضعیت فعال در OnBackPressedCallback
اکیداً برای تغییرات موقت توصیه میشود، زیرا ترتیبی را که در بالا توضیح داده شد حفظ میکند، که به ویژه در صورتی که تماسهای برگشتی در چندین مالک چرخه عمر تودرتو ثبت شده باشد، بسیار مهم است.
با این حال، در مواردی که می خواهید OnBackPressedCallback
به طور کامل حذف کنید، باید remove()
فراخوانی کنید. با این حال، این معمولاً ضروری نیست، زیرا زمانی که LifecycleOwner
مرتبط با آنها از بین میرود، تماسهای برگشتی بهطور خودکار حذف میشوند.
فعالیت onBackPressed()
اگر از onBackPressed()
برای مدیریت رویدادهای دکمه Back استفاده می کنید، توصیه می کنیم به جای آن از OnBackPressedCallback
استفاده کنید. با این حال، اگر نمی توانید این تغییر را انجام دهید، قوانین زیر اعمال می شود:
- همه تماسهای ثبتشده از طریق
addCallback
با فراخوانیsuper.onBackPressed()
ارزیابی میشوند. - در Android 12 (سطح API 32) و پایینتر، بدون در نظر گرفتن موارد ثبتشده
OnBackPressedCallback
، همیشهonBackPressed
فراخوانی میشود.