Android: كيف أتجنب بدء النشاط الموجود بالفعل في المكدس؟




what is inflation in android (6)

إذا لم تكن بحاجة إلى النشاط الثاني بعد الآن ، فمن الجيد الانتهاء منه ، ثم يجب عليك القيام بذلك في النشاط الثاني بعد انتهاء العملية:

startActivity(new Intent(this, FirstActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
finish();

دعونا نحاول شرح سؤالي: حصلت على تطبيق وخدمة. يبدأ التطبيق بالنشاط A. ترسل الخدمة بثًا سيسمح للتطبيق ببدء النشاط B الآن يبدأ المستخدم النشاط C.

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

كيف يمكنني تجنب ذلك أنها ستطلق النشاط B بسبب وجودها بالفعل في المكدس؟



أقترح عليك استخدام Intent.FLAG_ACTIVITY_CLEAR_TOP لأنه سيزيل جميع الأنشطة التي تبدأ من نشاطك المستهدف.

على سبيل المثال:

Intent intent = new Intent(sourceActivity, Target activity);

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

startActivity(intent)

النهج android:launchMode="singleInstance" ومجرد إضافة الأعلام إلى Intent لا تعمل بالنسبة لي. ما يعمل هو:

في الرمز الذي يبدأ النشاط فيه:

Intent intent = new Intent(activity, ActivityThatHasToBeStarted.class);
intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
startActivity(intent);

في ActivityThatHasToBeStarted :

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
        finish();
        return;
    }
    // Code for this creation
}

يمكنك استخدام العلامة Intent.FLAG_ACTIVITY_NEW_TASK . إذا كان النشاط قيد التشغيل بالفعل ، فسيؤدي ذلك إلى الأمام بدلاً من إنشاء نشاط جديد.

إذا قمت بإضافة Intent.FLAG_ACTIVITY_CLEAR_TOP مع هذا ، فسيتم مسح جميع الأنشطة بعد هذا النشاط في backstack.


إذا كان النشاط سيظهر في الأعلى إذا كان قد بدأ بالفعل ، FLAG_ACTIVITY_SINGLE_TOP علامة FLAG_ACTIVITY_SINGLE_TOP

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
mContext.startActivity(intent);






android-activity