سؤال

لدي نشاط A مع android:launchMode="singleTop" في البيان.

إذا ذهبت إلى النشاط B, C, ، و D لدي اختصارات قائمة للعودة إلى تطبيقات جذر التطبيقات الخاصة بي (A).

يشبه الرمز هذا:

Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
startActivity(myIntent);

ومع ذلك، بدلا من العودة إلى المثيل الموجود بالفعل A من بلدي MainActivity.class يخلق مثيل جديد -> يذهب إلى onCreate() بدلاً من onNewIntent().

هذا ليس هو السلوك المتوقع، أليس كذلك؟

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

المحلول

هذا ينبغي أن تفعل خدعة.

<activity ... android:launchMode="singleTop" />

عند إنشاء نية لبدء استخدام التطبيق:

Intent intent= new Intent(context, YourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);

هذا يجب أن تكون هناك حاجة.

نصائح أخرى

ما كان يعمل بالفعل بالنسبة لي في النهاية كان هذا:

Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(myIntent);

اقتباس من توثيق:

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

أنا لست متأكدا 100٪ ما "لديه بالفعل مثيل موجود للنشاط في الجزء العلوي من مكدسه" يعني، ولكن ربما لا يجتمع نشاطك هذا الشرط.

سيكون singleTask أو singleInstance اعمل لاجلك؟ أو ربما يمكنك تجربة الإعداد FLAG_ACTIVITY_SINGLE_TOP بناء على النية، تقوم بإنشاء لمعرفة ما إذا كان ذلك يحدث فرقا، على الرغم من أنني لا أعتقد أنه سوف.

يمكنك العودة إلى نفس مثيل النشاط الموجود معandroid:launchMode="singleInstance"

في البيان. عند العودة إلى A من عند B, ، قد تكون هناك حاجة finish() لتدمير B.

أولا، يمكن فحص هيكل المكدس. لوضع الإطلاق: SingleTOP
إذا كان مثيل من نفس النشاط موجودا بالفعل في أعلى مكدس المهمة، فسيتم إعادة استخدام هذه الحالة للاستجابة للقصد.

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

android:name=".ActivityA"
android:launchMode="singleTop"

إذا كنت في نشاط النشاط، فستنشئ النشاط، فلن يتم استئناف OnCreate OnCreate () ويمكنك أن ترى عن طريق إنشاء إشعار غير: إذا لم تنفذ OnNewintent (نية) فلن تحصل على نية جديدة.

Intent activityMain = new Intent(ActivityA.this,
                        ActivityA.class);

                activityMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                        | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                startActivity(activityMain);




    @Override
        protected void onNewIntent(Intent intent) {

            super.onNewIntent(intent);

            notify("onNewIntent");
        }

        private void notify(String methodName) {

            String name = this.getClass().getName();
            String[] strings = name.split("\\.");

            Notification noti = new Notification.Builder(this)
                    .setContentTitle(methodName + "" + strings[strings.length - 1])
                    .setAutoCancel(true).setSmallIcon(R.drawable.ic_launcher)
                    .setContentText(name).build();
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            notificationManager.notify((int) System.currentTimeMillis(), noti);

        }

وذلك لأن النشاط الأصلي يتم بالفعل تدميره بالفعل بحلول الوقت الذي تبدأ فيه من B أو C أو D. لذلك، سيتم استدعاء OnCreate في موقد Onnewintent (). طريقة واحدة لحل هذا هو دائما تدمير الموجودة دائما (باستخدام Flag_activity_Task | Flag_activity_New_Task بالاقتران عند بدء التشغيل) قبل بدء تشغيل جديد، لذلك سيتم استدعاء OnCreate دائما، وأنت وضع رمز OnNewintent () في OnCreate عن طريق التحقق من ذلك إذا Getintent ( ) هو النية التي بدأت بها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top