پیمایش برگشتی نحوه حرکت کاربران در تاریخچه صفحههایی است که قبلاً بازدید کردهاند. همه دستگاههای اندرویدی یک دکمه برگشت برای این نوع پیمایش ارائه میکنند، بنابراین دکمه برگشت را به رابط کاربری برنامه خود اضافه نکنید. بسته به دستگاه اندرویدی کاربر، این دکمه ممکن است یک دکمه فیزیکی یا یک دکمه نرم افزاری باشد.
در حالی که کاربر در سرتاسر برنامه شما پیمایش می کند، اندروید یک دسته پشتی از مقصدها را حفظ می کند. این به اندروید اجازه میدهد با فشار دادن دکمه بازگشت، بهدرستی به مقصدهای قبلی حرکت کند. با این حال، چند مورد وجود دارد که برنامه شما ممکن است نیاز به اجرای رفتار Back خود داشته باشد تا بهترین تجربه کاربری ممکن را ارائه دهد.
برای مثال، هنگام استفاده از WebView
، ممکن است بخواهید رفتار پیشفرض دکمه Back را لغو کنید تا به کاربر اجازه دهید به جای صفحههای قبلی در برنامه شما، در تاریخچه مرور وب خود به عقب برگردد.
Android 13 و بالاتر شامل یک حرکت پیشبینی کننده برگشت برای دستگاههای Android است. برای کسب اطلاعات بیشتر در مورد این ویژگی، به «افزودن پشتیبانی برای حرکت پیشگویانه برگشت» مراجعه کنید.
پیاده سازی ناوبری برگشتی سفارشی
ComponentActivity
، کلاس پایه FragmentActivity
و AppCompatActivity
، به شما امکان می دهد رفتار دکمه Back را با استفاده از OnBackPressedDispatcher
کنترل کنید، که می توانید با فراخوانی getOnBackPressedDispatcher()
را بازیابی کنید.
OnBackPressedDispatcher
نحوه ارسال رویدادهای دکمه Back به یک یا چند شی OnBackPressedCallback
را کنترل می کند. سازنده برای OnBackPressedCallback
یک بولی برای حالت فعال اولیه می گیرد. هنگامی که یک callback فعال میشود - یعنی isEnabled()
true
را برمیگرداند - توزیعکننده handleOnBackPressed()
callback را فراخوانی میکند تا رویداد دکمه برگشت را مدیریت کند. با فراخوانی setEnabled()
می توانید وضعیت فعال را تغییر دهید.
تماسها با استفاده از روشهای addCallback
اضافه میشوند. توصیه می کنیم از متد addCallback()
استفاده کنید که یک LifecycleOwner
می گیرد. این تضمین میکند که OnBackPressedCallback
فقط زمانی اضافه میشود که LifecycleOwner
Lifecycle.State.STARTED
باشد. این اکتیویتی همچنین تماسهای ثبتشده را هنگامی که LifecycleOwner
مرتبط با آنها از بین میرود، حذف میکند، که از نشت حافظه جلوگیری میکند و LifecycleOwner
برای استفاده در قطعات یا سایر دارندگان چرخه حیات که طول عمر کمتری نسبت به فعالیت دارند، مناسب میکند.
در اینجا یک نمونه اجرای callback آورده شده است:
کاتلین
class MyFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // This callback is only 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 is only 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
فقط در صورتی فراخوانی می شود که callback two
فعال نباشد.
توجه داشته باشید که وقتی callback با استفاده از addCallback()
اضافه میشود، تا زمانی که LifecycleOwner
وارد وضعیت Lifecycle.State.STARTED
نشود، به زنجیره مسئولیت اضافه نمیشود.
توصیه میکنیم حالت فعال در OnBackPressedCallback
را برای تغییرات موقت تغییر دهید، زیرا انجام این کار باعث حفظ ترتیب توضیح داده شده در بالا میشود. این امر به ویژه در صورتی که تماسهای برگشتی روی چندین مالک چرخه حیات تودرتو ثبت شده باشد، مهم است.
در مواردی که می خواهید OnBackPressedCallback
به طور کامل حذف کنید، می توانید remove()
فراخوانی کنید. این معمولاً ضروری نیست، زیرا زمانی که LifecycleOwner
مرتبط با آنها از بین میرود، تماسهای برگشتی بهطور خودکار حذف میشوند.
فعالیت onBackPressed()
اگر از onBackPressed()
برای مدیریت رویدادهای دکمه Back استفاده می کنید، توصیه می کنیم به جای آن از OnBackPressedCallback
استفاده کنید. با این حال، اگر نمی توانید این تغییر را ایجاد کنید، قوانین زیر اعمال می شود:
- همه تماسهای ثبتشده از طریق
addCallback
با فراخوانیsuper.onBackPressed()
ارزیابی میشوند. - در Android 12 (سطح API 32) و پایینتر، بدون در نظر گرفتن موارد ثبتشده
OnBackPressedCallback
، همیشهonBackPressed
فراخوانی میشود.