سؤال

يحتوي تطبيقي على شاشات التدفق التالية :

Home->screen 1->screen 2->screen 3->screen 4->screen 5

الآن لدي مشترك log out زر في كل الشاشات

(Home/ screen 1 / screen 2 /screen 3/ screen 4 / screen 5)

أريد أنه عندما ينقر المستخدم على زر تسجيل الخروج (من أي شاشة) ، سيتم الانتهاء من جميع الشاشات وشاشة جديدة Log in سوف تفتح .

لقد حاولت كل شيء تقريبا FLAG_ACTIVITY لتحقيق ذلك.أذهب أيضا من خلال بعض الإجابات في ستاكوفيرفلو ، ولكن عدم القدرة على حل المشكلة.طلبي هو على الروبوت 1.6 حتى لا تكون قادرة على استخدام FLAG_ACTIVITY_CLEAR_TASK

هل هناك أي طريقة لحل المشكلة ?

هل كانت مفيدة؟

المحلول

استخدام:

Intent intent = new Intent(getApplicationContext(), Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

سيؤدي هذا إلى مسح جميع الأنشطة على رأس المنزل.

على افتراض انك الانتهاء من شاشة تسجيل الدخول عندما يقوم المستخدم بتسجيل الدخول ويتم إنشاء المنزل وبعد ذلك جميع الشاشات من 1 إلى 5 على رأس ذلك واحد.سيعيدك الرمز الذي نشرته إلى الشاشة الرئيسية لإنهاء جميع الأنشطة الأخرى.يمكنك إضافة مبلغ إضافي في القصد وقراءة ذلك في نشاط الشاشة الرئيسية وإنهائه أيضا (ربما قم بتشغيل شاشة تسجيل الدخول مرة أخرى من هناك أو شيء من هذا القبيل).

لست متأكدا ولكن يمكنك أيضا محاولة تسجيل الدخول باستخدام هذه العلامة.لا أعرف كيف سيتم طلب الأنشطة في هذه الحالة.لذلك لا أعرف ما إذا كان سيتم مسح تلك الموجودة أسفل الشاشة كنت على بما في ذلك واحد كنت حاليا على ولكن بالتأكيد وسيلة للذهاب.

نأمل أن يساعد هذا.

نصائح أخرى

يمكنك محاولة Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK.وسوف يمسح تماما كل النشاط السابق (ق) وبدء نشاط جديد.

قبل بدء نشاطك الجديد ، ما عليك سوى إضافة الكود التالي:

finishAffinity();

أو إذا كنت تريد أن تعمل في الإصدارات السابقة من الروبوت:

ActivityCompat.finishAffinity(this);

عندما يرغب المستخدم في الخروج من جميع الأنشطة المفتوحة, ، يجب عليهم الضغط على زر يقوم بتحميل النشاط الأول الذي يتم تشغيله عند بدء تشغيل التطبيق الخاص بك ، ومسح جميع الأنشطة الأخرى ، ثم الانتهاء من آخر نشاط متبقي.قم بتشغيل الكود التالي عندما يضغط المستخدم على زر الخروج.في حالتي, LoginActivity هو النشاط الأول في برنامجي لتشغيل.

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

رمز أعلاه مسح جميع الأنشطة باستثناء LoginActivity.ثم وضع التعليمات البرمجية التالية داخل LoginActivityفي onCreate(...), ، للاستماع إلى متى LoginActivity يتم إعادة إنشاء وتم تمرير إشارة 'الخروج' :

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();  
}

لماذا يجعل زر الخروج في الروبوت من الصعب جدا?

الروبوت يحاول جاهدا لثني لكم من وجود زر" الخروج " في التطبيق الخاص بك ، لأنهم يريدون للمستخدم أن لا يهتمون أبدا ما إذا كانت البرامج التي يستخدمونها تعمل في الخلفية أم لا.

المطورين نظام التشغيل أندرويد تريد البرنامج لتكون قادرة على البقاء على قيد الحياة اغلاق غير متوقع وانقطاع التيار الكهربائي من الهاتف ، وعندما يقوم المستخدم بإعادة تشغيل البرنامج ، فإنها تلتقط الحق حيث توقفت.لذلك يمكن للمستخدم تلقي مكالمة هاتفية أثناء استخدام التطبيق الخاص بك ، وفتح الخرائط التي تتطلب تحرير التطبيق الخاص بك لمزيد من الموارد.

عندما يستأنف المستخدم التطبيق الخاص بك ، فإنها تلتقط الحق حيث توقفت دون انقطاع.زر الخروج هذا يغتصب الطاقة من مدير النشاط ، مما قد يتسبب في حدوث مشكلات في دورة حياة برنامج أندرويد المدارة تلقائيا.

Intent intent = new Intent(this, classObject);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

وهذا العمل لجميع إصدارات أندرويد.أين IntentCompat وأضاف الطبقة في مكتبة دعم الروبوت.

استخدم ما يلي للنشاط

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

قم بإزالة علامة مسح المهام لاستخدام الأجزاء.

آمل أن يكون هذا قد تستخدم لبعض الناس.

من عند developer.android.com:

public void finishAffinity ()

تمت الإضافة في مستوى واجهة برمجة التطبيقات 16

قم بإنهاء هذا النشاط بالإضافة إلى جميع الأنشطة الموجودة أسفله مباشرة في المهمة الحالية التي لها نفس التقارب.يستخدم هذا عادة عندما يمكن تشغيل تطبيق إلى مهمة أخرى (مثل من عرض عمل لنوع محتوى يفهمه) وقد استخدم المستخدم التنقل لأعلى للتبديل من المهمة الحالية وإلى مهمته الخاصة.في هذه الحالة ، إذا انتقل المستخدم إلى أي أنشطة أخرى للتطبيق الثاني ، فيجب إزالة كل هذه الأنشطة من المهمة الأصلية كجزء من مفتاح المهمة.

لاحظ أن هذه النهاية لا تسمح لك بتقديم نتائج للنشاط السابق ، وسيتم طرح استثناء إذا كنت تحاول القيام بذلك.

أعتقد أنني في وقت متأخر ولكن هناك إجابة بسيطة وقصيرة.هناك طريقة فينيشافينيتي () في النشاط الذي سينهي النشاط الحالي وجميع الأنشطة الأم ، لكنه يعمل فقط في الروبوت 4.1 أو أعلى.

ل أبي 16+ ، استخدام

finishAffinity();

لأقل من 16 ، استخدم

ActivityCompat.finishAffinity(YourActivity.this);

آمل أن يساعد!

في ملاحظة جانبية ، من الجيد أن تعرف
هذه الإجابة تعمل (https://stackoverflow.com/a/13468685/7034327)

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
this.finish();

في حين أن هذا لا يعمل

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

.setFlags() يستبدل أي أعلام سابقة ولا إلحاق أي أعلام جديدة في حين .addFlags() هل.

لذلك سيعمل هذا أيضا

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

إذا كان التطبيق الخاص بك لديه الحد الأدنى سك الإصدار 16 ثم يمكنك استخدام فينيشافينيتي()

قم بإنهاء هذا النشاط بالإضافة إلى جميع الأنشطة الموجودة أسفله مباشرة في المهمة الحالية التي لها نفس التقارب.

هذا عمل بالنسبة لي في أعلى شاشة الدفع قم بإزالة جميع أنشطة المكدس الخلفي,

@Override
public void onBackPressed() {
         finishAffinity();
        startActivity(new Intent(PaymentDoneActivity.this,Home.class));
    } 

http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29

حل قمت بتنفيذه لهذا (أعتقد أنني وجدته على تجاوز المكدس في مكان ما ، لكنني لا أتذكر ، لذلك بفضل من فعل ذلك في المقام الأول):

من أي من الأنشطة الخاصة بك القيام بذلك:

// Clear your session, remove preferences, etc.
Intent intent  = new Intent(getBaseContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

ثم في لوجيناكتيفيتي الخاص بك ، الكتابة أونكيدون:

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

لزر الخروج على الشاشة الأخيرة من التطبيق ، استخدم هذا الرمز على المستمع زر الخروج لإنهاء جميع الأنشطة السابقة المفتوحة ، ويتم حل مشكلتك.

{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
    Intent i1=new Intent(getApplicationContext(),StartUp_Page.class);
i1.setAction(Intent.ACTION_MAIN);
i1.addCategory(Intent.CATEGORY_HOME);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i1);
finish();

لدي نفس المشكلة يمكنك استخدام IntentCompat ، مثل هذا :

import android.support.v4.content.IntentCompat;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

هذا الرمز يعمل بالنسبة لي .

الروبوت أبي 17

بدلا من استخدام finish() مجرد استخدام finishAffinity();

في حالتي أنا استخدم finishAffinity() وظيفة في النشاط الأخير مثل:

finishAffinity()
startHomeActivity()

آمل أن يكون مفيدا.

تسجيل الدخول- > الصفحة الرئيسية- > الشاشة 1 - > الشاشة 2 - > الشاشة 3 - > الشاشة 4 - > الشاشة 5

على الشاشة 4 (أو أي دولة أخرى) ->

StartActivity(Log in)
مع
FLAG_ACTIVITY_CLEAR_TOP

ل أبي > = 15 إلى أبي 23 حل بسيط.

 Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
 nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
 startActivity(nextScreen);
 ActivityCompat.finishAffinity(currentActivity.this);

إذا كنت تستخدم startActivityForResult() في أنشطتك السابقة ، فقط تجاوز OnActivityResult() وندعو finish(); طريقة داخله في جميع الأنشطة..هذا سوف يؤدي المهمة...

عندما ينقر المستخدم على زر الخروج ، اكتب الكود التالي:

Intent intent = new Intent(this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

وأيضا عندما بعد تسجيل الدخول إذا كنت استدعاء نشاط جديد لا تستخدم إنهاء ();

ببساطة ، عندما تذهب من شاشة تسجيل الدخول ، وليس عند الانتهاء من شاشة تسجيل الدخول.

ثم في جميع الأنشطة إلى الأمام ، استخدم هذا لتسجيل الخروج:

final Intent intent = new Intent(getBaseContext(), LoginScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);

إنه يعمل بشكل مثالي.

إذا قمت بتسجيل الدخول المستخدم في screen 1 ومن هناك تذهب إلى الشاشات الأخرى ، استخدم

Intent intent = new Intent(this, Screen1.class);
intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

لقد وجدت بهذه الطريقة ، وسوف مسح كل التاريخ والخروج

Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
Intent intent = new Intent(getApplicationContext(), SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

finish();
System.exit(0);

لقد وجدت هذا الحل للعمل على كل جهاز على الرغم من مستوى أبي (حتى ل < 11)

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top