Переместить до родительской активности из уведомления

Мой вопрос состоит в том, что у меня есть два вида деятельности: активность A и активность B. Активность A является основным видом деятельности, активность B доступна только прикосновением к уведомлению.

Мне нужно иметь возможность прикоснуться к уведомлению, которое откроет действие B. После того, как пользователь завершит действие B, они могут нажать кнопку «Назад» или завершить «Активность B.». Когда действие «B» закрывается, должно отображаться действие «A». В настоящее время я закрываю Activity A (который закрывает все приложение) и получает push-уведомление. Я выбираю push-уведомление, которое открывает Activity B. Когда я закрываю Activity B, Activity A не отображается, и все приложение закрывается. Я хочу, чтобы активность А была после завершения операции Б.

Я использую оповещения в формате SDK. В моем обычном ParsePushBroadcastReceiver у меня есть следующий код

public class MyReceiver extends ParsePushBroadcastReceiver { @Override public void onPushOpen(Context context, Intent intent) { Intent i = new Intent(context, NotificationActivity.class); i.putExtras(intent.getExtras()); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } } 

Я перечисляю его в манифесте Android. Моя активность уведомления в манифесте

 <activity android:name=".NotificationActivity" android:label="@string/app_name" android:windowSoftInputMode="adjustPan" android:screenOrientation="portrait" android:parentActivityName=".MainActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity"/> </activity> 

В моей деятельности по уведомлению у меня есть следующий код в onBackPressed

 public class NotificationActivity extends ActionBarActivity {... @Override public void onBackPressed() { if(NavUtils.getParentActivityName(this) != null) { Log.d(Constants.NAVIGATION_DEBUG, "Get Parent Activity NOT NULL"); NavUtils.navigateUpFromSameTask(this); } else { Log.d(Constants.NAVIGATION_DEBUG, "Get Parent Activity NULL"); super.onBackPressed(); } } ...} 

Удивительно, что в журналах указано, что он НЕ НЕЛЬЗЯ, однако он не переходит к Activity A, если приложение было закрыто до нажатия уведомления. Вместо этого приложение закрывается. Я хочу, чтобы Activity A показывал, закрыто ли приложение, когда было нажато уведомление или открыто ли приложение. БЛАГОДАРЯ!

Для временного решения вы должны запустить MainActivity onBackPress () NotificationActivity.

Вы можете попробовать следующий метод: поместите некоторые логические дополнительные в свои намерения, а затем запустите MainActivity . Этот дополнительный показатель станет индикатором начала NotificationActivity .

 public class MyReceiver extends ParsePushBroadcastReceiver { @Override public void onPushOpen(Context context, Intent intent) { Intent i = new Intent(context, MainActivity.class); i.putExtras(intent.getExtras()); i.putExtra("IS_FROM_NOTIFICATION", true); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } } 

Затем в MainActivity's onCreate() вашего MainActivity's сделайте что-то вроде этого:

 public class MainActivity extends ActionBarActivity { ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (getIntent().getBooleanExtra("IS_FROM_NOTIFICATION", false)) { startActivity(MainActivity.this, NotificationActivity.class); } } // other initialization code ... ... } 

Тогда вам не нужно переопределять onBackPressed в вашей NotificationActivity .

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

Объяснение: В действии oncreate я проверяю Intent, чтобы узнать, находится ли пользователь в приложении из-за выбора уведомления. Если это так, я могу перейти к фрагменту уведомления, если не могу перейти к основному фрагменту. После того, как пользователь закончит с фрагментом уведомления, пользователь будет либо нажимать клавишу «Назад» на своем телефоне, либо нажать стрелку назад в ActionBar, поэтому разработчик должен обрабатывать обе эти ситуации.

Для обращения к кнопке «Назад» на телефоне просто переопределите функцию «назад» в вашей активности и проверьте, находится ли пользователь в фрагменте уведомления, если это так, то плавно переходите к основному фрагменту, не сохраняя фрагмент уведомления в задней части экрана.

Чтобы обработать кнопку «Назад» на панели действий, переопределить onoptionsselected в вашем фрагменте, и когда пользователь нажимает кнопку «Назад» (android.R.id.home), вы просто плавно переходите к своему основному фрагменту.

Если вы также управляете переопределением своей активности на новом месте, просто передайте логический фрагмент, чтобы ваш фрагмент уведомления знал, был ли он открыт из onnewintent или oncreate из вашей активности.

Если фрагмент уведомления открыт из onnewintent, вы не захотите перейти на ваш основной фрагмент, так как ваш основной фрагмент уже будет открыт и находится в задней части. Таким образом, вы просто POP фрагменты backstack, или пусть система Android автоматически обрабатывает правильную навигацию.

Это большая работа, но это решение, и теоретически это решение должно работать во всех API Android от GINGERBREAD – LOLLIPOP , если пользователь использует Фрагменты, а пользователь использует настраиваемую анимацию для перехода между фрагментами.

Ключ использует переход пользовательского фрагмента из фрагмента уведомления обратно в основной фрагмент (или в случае onnewintent, какой бы фрагмент не появился перед ним), чтобы создать впечатление, что пользователь переходит к BACKWARDS из фрагмента уведомления в основной фрагмент. Если кто-нибудь еще придет с лучшим решением … Я все уши.