آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

چگونگی نگهداری اطلاعات در متدهای چرخه حیات

mosafer  9 سال پیش  9 سال پیش
0 0

سلام

مهمترین اکتیویتی من جایی هست که کاربر اطلاعاتش رو وارد میکنه. 

از این جهت خیلی مهم هست که تمام مشکلاتش رو رفع کنم چون براساس اون اطلاعات برنامه به کاربر نمودار میده.

اگر در حین وارد کردن اطلاعات کاربر به اشتباه بر روی دکمه Power بزنه اطلاعات پاک میشه.

همون زمانی که صفحه نمایش خاموش میشه و وقتی دوباره روشن میکنم هم اطلاعات پاک میشه هم بعضی مواقع میره به اکتیویتی های قبلی!!!

چطور این چرخه رو مدیریت کنم؟

ممنون از توجهتون

 برای این سوال 4 پاسخ وجود دارد.
پاسخ به سوال 
mosafer  9 سال پیش
0 0

فکر کنم تقریبا بدونم مشکلم کجاست!

 شکل و ماهیت برنامم جوری هست که باید تمام اکتیویتی ها به صورت landspace باشه. حالا هنگامی که کاربر دکمه Power زد صفحه نمایش خاموش میشه و سپس کاربر این دکمه رو فشار بده و صفحه نمایش روشن بشه که به صورت خودکار وارد صفحه قفل گوشی میشه که بصورت portrait هست میره که به احتمال خیلی زیاد مشکل همینجا باید باشه.

من در فایل منیفستم همه اکتیویتی هارو به این شکل landspace کردم : 

  <activity android:name=".ActivityLogin"

android:screenOrientation="landscape"

android:theme="@android:style/Theme.NoTitleBar">
</activity>

خب حالا کسی هست بگه باید چکار کنم؟

+1 0
در مانیفست و در تگ اکتیویتی اینو اضافه کن : android:configChanges="keyboard|keyboardHidden|orientation|screenSize" (9 سال پیش)
0 0
یه قسمتش حل شد که اکتیویتیم کلا کشته میشد. ایراد هم این بود چون من تمام اکتیویتی هام به حالت landscape بودن من فقط فایلهای xml مربوط به این حالت رو گذاشته بودم ینی در پوشه layout-land. فقط من همه فایلهای xml رو کپی گرفتم و در پوشه layout پیس کردم.اینطوری دیگه اکتیویتیم نابود نمیشه و خطا نمیده. ولی یه مسئله من که همون ذخیره اطلاعات هست باقی مونده که دار روش کار میکنم. (9 سال پیش)
پاسخ به سوال 
Rabbit  9 سال پیش
+1 0

بایستی اطلاعات رو به شکل زیر ذخیره کنید:

 
@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");
}
+1 0
بله ممنون پیدا کردم. خواستم بیام کدشو بذارم که شما لطف کردین...ممنون از وقتی که برام گذاشتی Rabbit جان (9 سال پیش)
پاسخ به سوال 
mosafer  9 سال پیش
0 0

حالا یه مسئله دیگه ای پیش امده برام.

من همه متغیرهام رو ذخیره کردم و تونستم بگیرمشون. حالا من یه ترد برای تایمرم دارم که دقیقا نمیدونم چیشو باید ذخیره کنم و چطور مقدارشو بگیرم.

متغیر هام اینان :

  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 گفتن و به چه شکل ذخیره و بازیابی کنم. دوباره وقتی به اکتیویتیم برگشتم زمان از همون جایی که اکتیویتیم بسته شد دوباره شروع به کار کنه

بازم ممنون از لطف همه

+1 0
شما مقادیر رو که به همون شکل که بالا گفتم نگهداری کنید. اما برای اینکه با دوباره اجرا شدن اکتیویتی کار ترد شروع بشه باید داخل onResume کدهای مربوط به شروع دوباره رو قرار بدید و داخل onPause کدهای مربوط به متوقف کردن ترد رو. با هربار متوقف کردن مقادیر رو ذخیره کنید و با هربار شروع مقادیر رو بارخونی کنید. (9 سال پیش)
پاسخ به سوال 
mosafer  9 سال پیش
0 0

من همونجور که شما گفتی عمل کردم

ولی به یه مورد برخوردم که وقتی مثلا زمان روی 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);

}

 

 
0 0
راستش من متوجه نشدم مشکل از کجاست. کد رو دیباگ کنید حتما مشخص میشه. (9 سال پیش)
0 0
این قسمتش درست شد. نباید timeInMilliseconds ذخیره و بازیابی میکردم. (9 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .