چگونگی نگهداری اطلاعات در متدهای چرخه حیات
سلام
مهمترین اکتیویتی من جایی هست که کاربر اطلاعاتش رو وارد میکنه.
از این جهت خیلی مهم هست که تمام مشکلاتش رو رفع کنم چون براساس اون اطلاعات برنامه به کاربر نمودار میده.
اگر در حین وارد کردن اطلاعات کاربر به اشتباه بر روی دکمه Power بزنه اطلاعات پاک میشه.
همون زمانی که صفحه نمایش خاموش میشه و وقتی دوباره روشن میکنم هم اطلاعات پاک میشه هم بعضی مواقع میره به اکتیویتی های قبلی!!!
چطور این چرخه رو مدیریت کنم؟
ممنون از توجهتون
فکر کنم تقریبا بدونم مشکلم کجاست!
شکل و ماهیت برنامم جوری هست که باید تمام اکتیویتی ها به صورت landspace باشه. حالا هنگامی که کاربر دکمه Power زد صفحه نمایش خاموش میشه و سپس کاربر این دکمه رو فشار بده و صفحه نمایش روشن بشه که به صورت خودکار وارد صفحه قفل گوشی میشه که بصورت portrait هست میره که به احتمال خیلی زیاد مشکل همینجا باید باشه.
من در فایل منیفستم همه اکتیویتی هارو به این شکل landspace کردم :
<activity android:name=".ActivityLogin"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.NoTitleBar">
</activity>
خب حالا کسی هست بگه باید چکار کنم؟
بایستی اطلاعات رو به شکل زیر ذخیره کنید:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putBoolean("mBool", false);
savedInstanceState.putDouble("mDouble", 2.2);
savedInstanceState.putString("mString", "My String");
super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
boolean mBool = savedInstanceState.getBoolean("mBook");
double mDouble = savedInstanceState.getDouble("mDouble");
String mString = savedInstanceState.getString("MString");
}
حالا یه مسئله دیگه ای پیش امده برام.
من همه متغیرهام رو ذخیره کردم و تونستم بگیرمشون. حالا من یه ترد برای تایمرم دارم که دقیقا نمیدونم چیشو باید ذخیره کنم و چطور مقدارشو بگیرم.
متغیر هام اینان :
private Handler customHandler = new Handler();
private long timeInMilliseconds = 0L;
private long timeSwapBuff = 0L;
private long updatedTime = 0L;
long stopTime = 0L;
private long saveTime = 0L;
private int secs = 0;
private int mins = 0;
private int sec = 0;
و اینم ترد من :
Runnable updateTimerThread = new Runnable() {
@Override
public void run() {
timeInMilliseconds = SystemClock.uptimeMillis() - startTime;
stopTime = SystemClock.uptimeMillis() * saveTime;
updatedTime = timeSwapBuff + timeInMilliseconds;
sec += (int) (updatedTime / 1000);
// Log.i("updatedTime : ", "" + updatedTime);
// Log.i("sec : ", "" + sec);
mins += sec / 60;
secs += sec % 60;
if (sec > 0) {
animateLinearLayout(txtHalf);
txtHalf.setVisibility(View.VISIBLE); }
textTimer.setText(String.format("%02d", mins) + " : " + String.format("%02d", secs));
customHandler.postDelayed(this, 0); }
};
و با این اجراش میکنم :
startTime = SystemClock.uptimeMillis();
customHandler.postDelayed(updateTimerThread, 0);
و با این متوقفش میکنم :
timeSwapBuff += timeInMilliseconds;
customHandler.removeCallbacks(updateTimerThread);
حالا من میخوام به هر دلیلی اگر این اکتیویتیم همونطوری که در ابتدای این صفحه گفتم اطلاعاتش پاک شد بتونم این ترد رو هم بازیابی کنم.
کدوم متغیر رو باید در دو متدی که آقای Robit گفتن و به چه شکل ذخیره و بازیابی کنم. دوباره وقتی به اکتیویتیم برگشتم زمان از همون جایی که اکتیویتیم بسته شد دوباره شروع به کار کنه
بازم ممنون از لطف همه
من همونجور که شما گفتی عمل کردم
ولی به یه مورد برخوردم که وقتی مثلا زمان روی 02:20 هست و از اکتیویتی خارج میشیم و دوباره وارد میشیم زمان تقریبا دوبرابر میشه مثلا میشه 04:30
کارایی که کردم اینجا میذارم...
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("mins", mins);
outState.putInt("sec", sec);
outState.putInt("secs", secs);
outState.putLong("timeInMilliseconds", timeInMilliseconds);
outState.putLong("timeSwapBuff", timeSwapBuff);
outState.putLong("startTime", startTime);
outState.putLong("updatedTime", updatedTime);
outState.putLong("stopTime", stopTime);
outState.putLong("saveTime", saveTime);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mins = savedInstanceState.getInt("mins");
sec = savedInstanceState.getInt("sec");
secs = savedInstanceState.getInt("secs");
timeInMilliseconds = savedInstanceState.getLong("timeInMilliseconds");
timeSwapBuff = savedInstanceState.getLong("timeSwapBuff");
startTime = savedInstanceState.getLong("startTime");
updatedTime = savedInstanceState.getLong("updatedTime");
stopTime = savedInstanceState.getLong("stopTime");
saveTime = savedInstanceState.getLong("saveTime");
}
@Override
protected void onResume() {
super.onResume();
startTime = SystemClock.uptimeMillis();
customHandler.postDelayed(updateTimerThread, 0);
}
@Override
protected void onPause() {
super.onPause();
timeSwapBuff += timeInMilliseconds;
customHandler.removeCallbacks(updateTimerThread);
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .