2

У меня есть приложение с сервисом и текущим уведомлением и два вида деятельности:андроида - уведомление нажмите показывает текущую деятельность, если приложение закрыто начать новую деятельность

Activity A и Activity B.

Activity A имеет кнопку, начинающуюся Activity B.

При нажатии на уведомление я хочу следующие сценарии произойдет:

  1. Если приложение закрыто -> запустить приложение с Activity A.
  2. Если приложение открывается либо на переднем плане или в фоновом режиме (открыт список приложений) в любой деятельности -> показать текущую деятельность без запуска нового Activity A, то есть, если я нахожусь в Activity B -> показать текущий Activity B и тот же для Activity A без запуск нового.

Я искал много, и, наконец, нашел answer, говоря, что вам нужно сделать:

final Intent notificationIntent = new Intent(context, ActivityA.class); 
notificationIntent.setAction(Intent.ACTION_MAIN); 
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

В Manifest у меня есть:

Примечание Я использовал android:launchMode="singleTop".

<activity 
     android:name=".ActivityA" 
     android:configChanges="keyboard|keyboardHidden|orientation|screenSize" 
     android:label="@string/app_name" 
     android:launchMode="singleTop" 
     android:theme="@style/AppTheme.NoActionBar"></activity> 
    <activity 
     android:name=".ActivityB" 
     android:configChanges="keyboard|keyboardHidden|orientation|screenSize" 
     android:theme="@style/AppTheme.NoActionBar"></activity> 

Это, похоже, недостаточно работает , и он никогда не работает, если вы выполните следующее: start app -> start activity A -> start service (показать уведомление) -> перейти к Activity B -> открывается уведомление об открытии Activity A.

мне было интересно, если есть более последовательное решение:

+0

Какая 'деятельность' такова: CATEGORY = LAUNCHER и ACTION = MAIN? –

ответ

2

Конечно, это будет всегда открытой ActivityA, потому что вы определили его здесь:

final Intent notificationIntent = new Intent(context, ActivityA.class); 

то, что вам нужно сделать, это определить, где вы были конец. вот как я бы справиться с этим:

сделать класс и расширить его из класса Application

определить переменную здесь, это может быть логическое значение, перечисление, INT, и т.д ... когда вы вводите любое из этих действий, измените этот параметр.

В OnDestroy каждого действия сбросьте эту конкретную переменную до значения по умолчанию.

В вашем сервисе перед тем, как сделать намерение, проверьте, в каком состоянии вы были наконец, и сделайте свое намерение на основе этого.

public class MY_APPLCIATION extends Application { 
    public static Boolean ActivityAIsRunning=false; 
    public static Boolean ActivityBIsRunning=false; 
} 

переопределение onResume и OnDestroy обоих видов деятельности:

public class ActivityA extends AppCompatActivity { 
    // ...... 
    @Override 
protected void onDestroy() { 
    super.onDestroy(); 
    MY_APPLCIATION.ActivityAIsRunning=false; 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    MY_APPLCIATION.ActivityAIsRunning=true; 
} 
} 

ActivityB:

public class ActivityB extends AppCompatActivity { 
    // ...... 
    @Override 
protected void onDestroy() { 
    super.onDestroy(); 
    MY_APPLCIATION.ActivityBIsRunning=false; 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    MY_APPLCIATION.ActivityBIsRunning=true; 
} 
} 

теперь есть трюк, который вы должны обратить внимание на:

Вы должны определить намерение при создании уведомления!

у вас должно быть другое действие (позволяет назвать его MY_NOTIFICATION_ACTIVITY). , и уведомление всегда должно идти на это мероприятие. Теперь в этом действии проверьте, какое булево значение задано, а затем вызовите требуемую активность (ActivityA или ActivityB). Не забывайте, что в вашем манифесте вы тоже должны сделать ActivityB singleInstance !!!

*** ДРУГОЙ SIMPLE МЕТОД

еще один простой способ обновить уведомление в OnResume каждого вида деятельности. , введя каждое действие, которое вы измените намерение на эту желаемую активность, и сделайте то же уведомление и обновите последнее уведомление.

+0

очень приятное решение! работает сейчас, спасибо! –

+0

Я сделал то, что вы предложили, используя операцию перенаправления, и проверив там булевские значения, и я сделал startActivity() с соответствующей деятельностью. По-видимому, startActivity всегда будет запускать новый экземпляр активности. когда вы написали «называть желаемую деятельность (ActivityA или ActivityB)», как вы имели в виду «называть» ее? –

+0

установите оба режима запуска активности в манифесте Android: launchMode = "singleInstance" @OfekAgmon –

Смежные вопросы