بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

از بین بردن پروسس برنامه طبق استاندارد اندروید

مدیریت گفتگو
مجتبی یگانه 12 سال پیش
آخرین تغییر: 12 سال پیش

سلام 
من معمولا برای بستن کل برنامه از دستور زیر استفاده می کنم

int p = android.os.Process.myPid();
android.os.Process.killProcess(p);

اما استاد در مورد پاسخ من این طور گفتند ( لینک ) 
به نقل از استاد:  "روش شما درسته، اما باید توجه داشته باشید که ممکنه برنامه شما بعد از بسته شدن Restart بشه، این مشکل در بسیاری از مواقع پیش میاد. در جمع باید سعی کنید کاری کنید که طبق استاندارد اندروید پیش برید و اونهم استفاده نکردن از خطوط بالا هست."

خوب سوال من اینه ، وقتی برنامه رو با زدن کلید Back در آخرین اکتیویتی می بندیم ، پروسس برنامه بسته نمیشه (!) پس روش استاندارد اندروید برای بسته شدن پردازش های اضافه چیه ؟

نظرات

hamidd 12 سال پیش
راهش اینه که اگه از thread یا سرویسی استفاده میکنی توی متد onbackpressed متوقفشون بکنی.
hamidd 12 سال پیش
هر اکتویویتی ای وقتی کاربر دکمه ی back را میزند بسته میشه.ولی اگه توی همون اکتیویتی thread ای تعریف شده باشه با زدن دکمه ی back اون thread در حال اجرا میمونه.
مجتبی یگانه 12 سال پیش
وقتی همه چیز تموم شده باشه ، ترد ها متوقف باشه و ... ، حالا بازم پروسس باز میمونه ! ، یعنی من به جز این دستور چیزی برای بستن پروسس ندیدم
OmidAhmadian 12 سال پیش
فکر کنم کد System.exit(0) d باعث بسته شدن نرم افزار می شه.
OmidAhmadian 12 سال پیش
همین که کارت راحت افتاد واسه ما Vote Upe :)

پاسخ‌ها 2

javac 12 سال پیش

چون سوالم به همین موضوع مربوط میشه دیگه تاپیک ایجاد نمیکنم

من یه ActivityEnhanced دارم به این صورت  که دوتا منو داخلش ساختم و این متد زیر رو هم ovrride کردم:

  @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.about: {
                Intent intent = new Intent(G.currentActivity,  ActivityAbout.class);
                G.currentActivity.startActivity(intent);
            }
                break;

            case R.id.exit: {
                finish();
                System.exit(0);

            }
                break;
        }
        return super.onOptionsItemSelected(item);
    }

و چندین اکتیویتی که از این ارث بری دارند.

وقتی روی menu ی خروج میزنم اگر توی صفحه اول برنامه باشم برنامه بسته میشه اما اگر داخل اکتیویتی های داخلی برنامه باشم از اونجا برمیگرده به اکتیویتی قبلش!!

چیکار کنم که با زدن دکمه ی خروج کلا برنامه بسته بشه؟!!

نظرات

hamidd 12 سال پیش
دستور finish(); برای بستن اکتیویتی فعلی به کار میره. فکر میکنم توی کد شما وقتی این دستور اجرا میشه باعث میشه که اکتیویتی بسته بشه و دیگه دستور System.exit(0); اجرا نشه. دستور finish(); رو حذف کنید از کدتون فکر کنم مشکل حل بشه. همون دستور system.exit (0); کافیه .کل اکیتیویتی ها و برنامه را می بنده. تست نکردم ولی اگه کار کرد لطفا اطلاع بدید.
javac 12 سال پیش
نه روش شما کار نمیکنه قبلا تست کردم روشی که پیدا کردم رو پایین نوشتم اما نمیدونم چقدر اصولیه !!:))
مجتبی یگانه 12 سال پیش
حق با javac هست ، وقتی برنامه نیاز به اجرا داشته باشه ، یعنی همه ی اکتیویتی ها بسته نباشن ، با بستن پروسس ، پروسس دوباره باز میشه ، و اکتیویتی اجرا میشه ، مگر اینکه از دستور پایین استفاده بشه
javac 12 سال پیش

راهش رو خودم پیدا کردم :)

توی اکتیویتی enhanced به این صورت یک extra می فرستیم:

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.about: {
                Intent intent = new Intent(G.currentActivity, ActivityAbout.class);
                G.currentActivity.startActivity(intent);
            }
                break;

            case R.id.exit: {
                Intent intent = new Intent(this, ActivityMain.class);
                intent.putExtra("mustFinish", true);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

                startActivityForResult(intent, 0);
                setResult(0);
                finish();

            }
                break;
        }
        return super.onOptionsItemSelected(item);
    }

و در activityMain چک میکنیم که باید بسته بشه برنامه یا نه؟

  @Override
    protected void onResume() {
        boolean isMustFinish;
        // TODO Auto-generated method stub
        super.onResume();
        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            isMustFinish = extras.getBoolean("mustFinish");
            if (isMustFinish) {
                System.exit(0);
            }

        }
    }



نظرات

مجتبی یگانه 12 سال پیش
بله روش درسته ، قبلا هم همین پاسخ تو انجمن بود ، تمام ایکیتویتی ها بسته بشه ، بعد کار انجام بشه ، که برای بستن پروسس هم system.exit(0) z میدیم :)
مجتبی یگانه 12 سال پیش
javac جان سوال 1395 رو یه نگاه بنداز ، یکه نکته ی جالبه !

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