Как запустить MainActivity (Activity1) после действия, запущенного из уведомления (Activity2) в удаленном на backpress - PullRequest
0 голосов
/ 27 октября 2019

После того, как действие запускается из уведомления, допустим, что действие 2 (результат) завершено или уничтожено, когда пользователь использует обратное нажатие, оно идет на домашний экран вместо основного действия. Как предотвратить это и открыть основное действие.

КакНа данный момент реализация метода состоит в том, чтобы проверить, запускается ли активность 2 из mainactivity (с использованием дополнительных функций) напрямую или из уведомлений, так что onDestory управляется на основе значений пакета, но при этом заметная разница во времени является исправлением или созданием истории стека. при запуске уведомления

текущий код

messagesservice.java

Intent resultIntent = new Intent(this, videonotifications.class);
       Intent parentIntent=new Intent(this, MainActivity.class);
       TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        //stackBuilder.addNextIntentWithParentStack(resultIntent);
        stackBuilder.addParentStack(videonotifications.class);
// Adds the Intent to the top of the stack
        stackBuilder.addNextIntent(resultIntent);
        PendingIntent resultPendingIntent =stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
        mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        createNotificationChannel(mNotificationManager);
        Notification notification = new NotificationCompat.Builder(this,DEFAULT_CHANNEL_ID)
                .setContentTitle("Fall Detected")
                .setStyle(new NotificationCompat.BigTextStyle()
                        .bigText("A Fall Has Been Detected By Smart Video Surveillance At Old Age Home's Common Room"))//Set the title of Notification
                .setSmallIcon(R.drawable.ic_home_black_24dp)
                .setAutoCancel(true)
                .setContentIntent(resultPendingIntent)
                .build();
        mNotificationManager.notify(1, notification);
        final Intent i=new Intent(this,notificationsservice.class);
        //stopService(i);

videnotification.java

public void onDestroy() {
      //to be optimized as the roundabout procedure
        super.onDestroy();
        Bundle extras;
        extras=getIntent().getExtras();
        if(extras==null){
        Intent i=new Intent(this,MainActivity.class);
        i.putExtra("activity","notification is already called");
        startActivity(i);
        }
    }

MainActivity.java

Bundle extras=null;
       extras=getIntent().getExtras();
       if(extras==null){
           final Intent i=new Intent(this, notificationsservice.class);
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                startService(i);
            }
        },5000);}

AndroidManifest.xml

<activity
            android:name=".videonotifications"
            android:parentActivityName=".MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity"/>
        </activity>

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

TL; DR - переопределить onBackPressed () [Метод, вызываемый, когда пользователь нажимает кнопку «Назад»], и если пользователь пришел к активности из уведомления, затем запустите MainActivity с помощью намерения.

Насколько я понимаю, вы хотите перейти от действия 2 (давайте назовем это FromNotificationActivity) к действию 1 (назовем это MainActivity) только тогда, когда FromNotificationActivity запускается нажатием на уведомление, т.е.:

Уведомление о щелчках пользователя ---> FromNotificationActivity запускается ---> нажимается кнопка «Назад» и FromNotificationActivity уничтожается ---> Вместо возврата на домашний экран вы хотите запустить MainActivity.

Я считаю, что самый быстрый способ сделать это -переопределение onBackPressed () и переход непосредственно к MainActivity, только если FromNotificationActivity запускается из уведомления.

Итак, когда вы создаете уведомление, добавьте эту строку -

intent.putExtra("origin_from_notification", true);

Итак, ваш построитель уведомленийбудет выглядеть так -

Intent intent = new Intent(context, FromNotificationActivity.class);
intent.putExtra("origin_from_notification", true);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

// TODO: Replace with .Build() for api >= 16
Notification notification = new Notification.Builder(context)
    .setContentTitle("Notification Title"
    .setContentText("Notification text")
    .setSmallIcon(R.drawable.icon)
    .setContentIntent(pendingIntent)
    .// Whatever more you want to add

Затем в своей функции FromNotificationActivity после onCreate () добавьте следующие строки -

@Override
public void onBackPressed() {
    // Check if the user came here from a notification
    if (getIntent().getBooleanExtra("origin_from_notification", true)) {
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
    } else {
        // Do whatever you want, the user came here from another screen
    }
}

И, опционально, если у вашей активности есть кнопка "Назад" в строке заголовка, используйте эту строку -

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            break;
    }
}

Надеюсь, это поможет!

0 голосов
/ 27 октября 2019

Сначала добавьте Activity2 атрибут android:parentActivityName в Manifest

<activity
    android:name=".Activity2"
    android:parentActivityName=".MainActivity" />

Затем, чтобы запустить действие, которое включает в себя задний стек действий, вам нужно создать экземпляр TaskStackBuilder и вызвать addNextIntentWithParentStack(), передав ему Intent для действия, которое вы хотите начать. Вы можете позвонить getPendingIntent(), чтобы получить PendingIntent, который включает весь задний стек.

// Create an Intent for the activity you want to start
Intent resultIntent = new Intent(this, Activity2.class);
// Create the TaskStackBuilder and add the intent, which inflates the back stack
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addNextIntentWithParentStack(resultIntent);
// Get the PendingIntent containing the entire back stack
PendingIntent resultPendingIntent =
        stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

Затем вы можете передать PendingIntent уведомлению как обычно:

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);
builder.setContentIntent(resultPendingIntent);
...
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(NOTIFICATION_ID, builder.build());
...