در قسمت بیست و چهارم آموزش اندروید در ادامه مفاهیم چرخش صفحه موشکافانه تر این موضوع را بررسی خواهیم کرد و نحوه حفظ اطلاعات پس از نابودی اکتیویتی و تعیین کردن جهت و تشخیض جهت حین جرا را آموزش داده ایم.
در تغییرات اساسی (تغییراتی که باعث نابودیه اکتیویتی میشود) اطلاعات از بین میرود برای مثال تغییری چون چرخش صفحه که باعث reset کردن اکتیویتی میشود ممکن است اطلاعات نیز از بین برود پس باید از این اتفاق جلوگیری شود.هنگام تخریب اکتیویتی دو متد امکان اجرا دارند که به شرح زیر است:
مثال زیر نحوه ذخیره یک رشته به نام ای دی را درون شی Bundle در متد ()onSavedInstanceState را نشان میدهد توجه کنید که این متد یک آرگومان Bundle را ارایه میدهد و همچنین از مقادیر key برای حفظ اطلاعات استفاده میکند. همانگونه که مشاهده میکنید با متد ()pustString یک مقدار رشته ای را با نام ID و مقدار مشخص ذخیره میکند.در انتها نیز superclass را برای ذخیره سازی فراخوانی کنید
@Override Public void onSavedInstanceState(Bundle onSavedInstance) { //--save whatever you need to persist— outstate.putString("name", "Marjan"); super.onSavedInstanceState(onSavedInsatance); }
وقتی که یک اکتیویتی باز ایجاد گردد اولین متدی که اجرا میشود متد ()onCreate است و به دنبال آن متد ()onRestoreInstanceState نیز اجرا میگردد تا حالت قبلی که با استفاده از متد ()onSavedInstanceState به واسطه شی Bundle (به این نکته توجه داشته باشید که تنها میتوان اطلاعات را در شی Bundle ذخیره کرد.) به عنوان آرگومان ذخیره شده است بازیابی گردد:
@Override Puclic void onRestoreInstanceState(Bundle savedInstanceState) { Super.onRestoreInstanceState(savedInstanceState); //--retrive the information persisted earlier— String name= savedInstanceState.getString("name");
بعضی مواقع نیاز است تا در زمان اجرای برنامه وضعیت جهت دستگاه را بدانیم برای اینکار از کلاس WindowManager استفاده میکنیم.
قطعه کد زیرتشخیص وضعیت دستگاه را هنگام اجرا نمایش میدهد:
import com.tejariapp.sqlite.R; public class test { import android.os.Bundle; import android.util.Log; import android.app.Activity; import android.view.*; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //--get the current display info-- WindowManager wm = getWindowManager(); Display d=wm.getDefaultDisplay(); if(d.getWidth() > d.getHeight()) { //--Landscape mode-- Log.d("Oriention", "Landscape mode"); } else { //--portrait mode-- Log.d("Oriention", "Portrait mode"); } } }
متد ()getDefaultDisplay یک شی از نوع Display که همان صفحه نمایش دستگاه باز است را برمیگرداند سپس با استفاده از طول و عرض آن میتوان جهت دستگاه را مشخص نمود.
گاهی اوقات تمایل دارید که برنامه شما تنها در یک جهت نمایش و اجرا شود برای این کار نیز میتوان از متد ()setRequestOriention کلاس اکتیویتی به شکل زیر استفاده کرد
import android.content.pm.ActivityInfo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //--change to landscape mode-- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); }
قطعه کد فوق صفحه دستگاه را به صورت عمودی نمایش میدهد. برای نمایش در حالت افقی نیز از عبارت زیر استفاده میکنیم
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
راه دیگری نیز برای تعیین جهت صفحه نمایش وجود دارد بدین ترتیب که در فایل manifest برنامه با استفاده از خصوصیت android:screenOrientation چنین تغییری ایجاد کنیم
<activity android:name=".MainActivity" android:label="@string/app_name" android:screenOrientation="portrait" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
کد بالا اکتیویتی را به صورت عمودی نمایش میدهد(landscape نیز برای حالت افقی و Sensor براساس سنسور شتاب سنج صفحه بکار میرود که به صورت پیش فرض از Sensor استفاده میشود) و از نابود شدن اکتیویتی جلوگیری میکند این بدین معناست که اکتیویتی با چرخش صفحه از بین نمیرود و نیازی به فراخوانی مجدد متد ()onCreate نیست.