View Full Version : مشکل خارج شدن از برنامه با زدن کلید Back در اندروید
alirezatkh2
دوشنبه 16 شهریور 1394, 15:04 عصر
سلام به همگی .
من چن وقتیه که کیوت دارم کار می کنم و اندروید می خوام کد بزنم.
هر برنامه ای برای اندروید می نویسم با زدن کلید Back از برنامه خارج می شه در صورتی که می می خوام به صفحه قبلی برگرده. کسی می دونه باید چیکار کنم؟ (در ضمن از widgets استفاده می کنم)
پاسخ:
در هدر MainWindow برنامتون این تعریف رو قرار بدید:
void keyPressEvent (QKeyEvent* event);
در فایل سورس MainWindow این ها رو بزارید:
void MainWindow::keyPressEvent (QKeyEvent* event)
{
if (event->key() == Qt::Key_Back)
{
qDebug() << "<<keyPressEvent>> " << "[[Back button]]";
event->accept();
}
}
حامد مصافی
دوشنبه 16 شهریور 1394, 16:54 عصر
Widgets or QtQuick ؟
alirezatkh2
سه شنبه 17 شهریور 1394, 08:55 صبح
Widgets or QtQuick ؟
ویجت استفاده می کنم. هنوز با QTQuick بلد نیستم کار کنم!
حامد مصافی
چهارشنبه 18 شهریور 1394, 09:26 صبح
void MainWindow::keyReleaseEvent(QKeyEvent *event){
if(event->key() == Qt::BackButton)
event->ignore();
}
alirezatkh2
چهارشنبه 18 شهریور 1394, 09:50 صبح
void MainWindow::keyReleaseEvent(QKeyEvent *event){
if(event->key() == Qt::BackButton)
event->ignore();
}
خیلی ممنون جواب داد. فقط با دستور ignore از برنامه خارج میشه. چه دستوری استفاده کنم که برنامه minimize بشه؟
حامد مصافی
چهارشنبه 18 شهریور 1394, 10:50 صبح
چیزی به نام Minimize در اندروید وجود نداره. برنامه شما از حالت فعال به غیر فعال تغییر حالت میده و تصمیمات بعدی بر عهده اندرویده. ممکنه برنامه شما رو تا مدتی در حال اجرا بذاره و یا اگر میزان رم موجود کم باشه برنامه شما رو متوقف کنه تا برنامه بعدی اجرا بشه.
alirezatkh2
چهارشنبه 18 شهریور 1394, 11:35 صبح
شاید اسمش minimize نباشه ولی حتما یه همچین حالتی وجود داره. مثل تلگرام که با زدن کلید Back برنامه بسته نمی شه ولی از دید کاربر میره و اگر پیغامی بیاد با notification خبر میده و تحت هر شرایطی تلگرام بازه مگر اینکه Force Stop بشه.
این حالت رو با چه دستوری میشه به وچود آورد؟
وقتی هر Event رو accept می کنم با زدن کلید Home این حالت رخ میده ولی می خوام با کلید Back انجام بده! چه کنم؟
hamid_hr
چهارشنبه 18 شهریور 1394, 12:52 عصر
فک کنم تلگرام یه سرویس در حالت اجرای دیگه هم میسازه (یا سرویس یا یه پروسس)
و اون همیشه فعال هست
حامد مصافی
چهارشنبه 18 شهریور 1394, 12:56 عصر
بله، چنین برنامههایی سرویس دارند که در پسزمینه اجرا میشه. اما در Qt و کلا NDK نمیشه سرویس ایجاد کرد
alirezatkh2
چهارشنبه 18 شهریور 1394, 14:48 عصر
بله، چنین برنامههایی سرویس دارند که در پسزمینه اجرا میشه. اما در Qt و کلا NDK نمیشه سرویس ایجاد کرد
حتما میشه . چون وقتی همه event ها رو accept می کنم با کلید Home دقیقا همچین اتفاقی میوفته!
مثلا من تو برنامم گفتم که هر موقع Start میشی با سرور لاگین شو. ولی وقتی اون اتفاق میوفته از دید کاربر میره ولی از سرور ارتباطش قطع نمیشه و حتی دوباره که روی آیکنش کلیک می کنم دوباره لاگین نمیشه و از همون جای قبلی میاد بالا. درصورتی که اگه برنامه بسته شده باشه دوباره باید لاگین بشه.
دوباره تست کردم دیدم بعد باز کردن مثلا ده تا برنامه ارتباطش با سرور قطع میشه. احتمالا اندروید رم کم آورده و برنامه رو بسته.
به اندازه همون ده تا برنامه هم app من باز بمونه کافیه . فقط چه دستوری بزنم که این اتفاق بیفته؟
حامد مصافی
چهارشنبه 18 شهریور 1394, 15:29 عصر
این دست شما نیست. اندروید این رویه رو مدیریت میکنه.
همیشه هم ده تا برنامه نیست. ممکنه برنامه بعدی نیاز به رم بیشتری داشته باشه. یا رم سیستم کم باشه و بلافاصله بعد از بسته شدن برنامه اندروید پروسه شما رو متوقف کنه.
چندین ماه روی این مسأله زمان گذاشتم. با افراد زیادی که هدفی مثل من داشتند مکاتبه کردم. چندین پروژه مشابه رو دیدم، به خاطر این موضوع کل سورس اندروید رو دانلود کردم تا سرآیندها و کتابخانههای اختصاصی رو داشته باشم. اما نتونستم مثالهای بایندر رو بدون کامپایل کل اندروید کامپایل کنم. در هیچ کجای اینترنت هم کسی چنین کاری نکرده.
شما هم اگر میخوای چیزی مثل تلگرام بسازی بهتره از جاوا استفاده کنی.
یا اینکه یک سرویس جاوا ایجاد کن و برنامه خودتو (به جای اکتیویتی) از سرویس لود کن (به شرطی که مصرف برنامت کم باشه)
hamid_hr
چهارشنبه 18 شهریور 1394, 18:20 عصر
خب ببخشید من تو بحث Qt و C++ خیلی بلد نیستم
ولی اگه یه ترد ایجاد بشه و ران بشه و این کار ها رو انجام بده بعد از خروج از برنامه اون ترد هم نابود میشه آیا؟
حامد مصافی
پنج شنبه 19 شهریور 1394, 08:11 صبح
لایه جاوا هنگام شروع به کار اکتیویتی برنامه شما رو که در یک فایل so (چیزی مانند dll در سیستمهای لینوکسی) ذخیره شده لود میکنه (با متد loadLibrary) و اونو نمایش میده. شما میتونید در برنامه ترد استفاده کنید. اما با توجه به اینکه هنگام از بین رفتن اکتیویتی برنامه (کتابخانه) شما هم unload میشه، ترد هم از بین میره.
alirezatkh2
شنبه 21 شهریور 1394, 09:20 صبح
این دست شما نیست. اندروید این رویه رو مدیریت میکنه.
همیشه هم ده تا برنامه نیست. ممکنه برنامه بعدی نیاز به رم بیشتری داشته باشه. یا رم سیستم کم باشه و بلافاصله بعد از بسته شدن برنامه اندروید پروسه شما رو متوقف کنه.
چندین ماه روی این مسأله زمان گذاشتم. با افراد زیادی که هدفی مثل من داشتند مکاتبه کردم. چندین پروژه مشابه رو دیدم، به خاطر این موضوع کل سورس اندروید رو دانلود کردم تا سرآیندها و کتابخانههای اختصاصی رو داشته باشم. اما نتونستم مثالهای بایندر رو بدون کامپایل کل اندروید کامپایل کنم. در هیچ کجای اینترنت هم کسی چنین کاری نکرده.
شما هم اگر میخوای چیزی مثل تلگرام بسازی بهتره از جاوا استفاده کنی.
یا اینکه یک سرویس جاوا ایجاد کن و برنامه خودتو (به جای اکتیویتی) از سرویس لود کن (به شرطی که مصرف برنامت کم باشه)
اقا خیلی ممنون که پاسخ دادید. کمک بزرگی بود. دارم روی همون راه حلی که گفتید کار می کنم!
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.