Проблемы с уведомлениями, PendingIntent и Intent Flags - PullRequest
4 голосов
/ 14 декабря 2011

(пропустите краткую сводку) У меня проблемы с последовательностью операций в моем приложении.Приложение имеет 3 действия, которые переходят от A к B к C (или от C к B к A, если назад нажимается последовательно).При нормальной работе приложение работает нормально, проблема, с которой я сталкиваюсь, заключается в получении уведомления C2DM.

Получив уведомление, я бы хотел, чтобы PendingIntent было отправлено текущей активной деятельности или в случаеесли приложение не запущено, запустите приложение.

В получателе уведомлений создается PendingIntent с любой текущей активностью (которая содержится в классе Application), это тоже работает нормально.

Однако проблемы возникают, когда действие изменилось по сравнению с тем, с которым был создан PendingIntent.

т.е. уведомление получено в действии C, а PendingIntent создано с намерением, указывающим на действие C. Пользователь возвращается к действию Aи щелкает уведомление, которое запускает намерение, и запускает действие C, и я хочу, чтобы оно было отправлено в A.

Что я хотел бы, это отправить намерение любому текущему действию.Я попытался создать Activity X, которая является целью PendingIntent, а затем, когда Activity X создается, проверить, какая Activity в настоящее время активна и которая хранится в классе Application.

Но я также столкнулся с проблемами здесь с Intentflags.It хотел использовать флаг SINGLE_TOP для намерений, которые я буду использовать, чтобы гарантировать, что onNewIntent вызывается для текущего Activity, чтобы у меня не было проблем с кодом в onCreate и onResume.

Проблема, с которой я здесь сталкиваюсьв том, что Activity X сейчас находится на вершине стека активности, а одна вершина - нет из-за этого.Я попытался использовать флаги NO_HISTORY и EXCLUDE_FROM_RECENTS для ожидающего намерения, чтобы действие X не добавлялось в стек, а затем использовать SINGLE_TOP для запуска действий A, B или C, но при этом создается новый их экземпляр, а не тот, которыйсуществует.

В заключение:

 4 activities: A,B,C,X and a receiver for notifications.

 on receipt of a notification:
     //not sure which is better to use or even if they're right for my purpose
     start X with a PendingIntent with FLAG_ACTIVITY_NO_HISTORY or FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

     Acivity X then gets the currently running activity from Application (A,B or C)
         create an intent for the current activity (A,B or C) with FLAG_ACTIVITY_SINGLE_TOP

But onNewIntent is never called a new instance of A,B or C is created.

Есть ли более разумный подход к этой проблеме, неправильно ли используются флаги?Я неправильно понимаю что-то фундаментальное в том, как работает намерение, любая помощь будет оценена.И извините за длинный вопрос.Также, если требуется код, я могу опубликовать его завтра, так как я далеко от своей рабочей станции.

Ответы [ 2 ]

4 голосов
/ 14 декабря 2011

Ответ Сухи дал мне идею попробовать установить значения в манифесте.

Итак, в манифесте для Деятельности X

android:noHistory="true"
android:launchMode="singleInstance"

и в манифесте для Актов A, B и C

android:launchMode="singleTop"

Я все еще использую флаг NO_HISTORY в своем ожидаемом намерении, хотя

startActivity.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
            startActivity, PendingIntent.FLAG_UPDATE_CURRENT);

и в Деятельности X, которая затем отправляет намерение A, B или C

    //onCreate
    myApp = (MyApplication)getApplication();
    String s = myApp.getCurrentActivity();

    if(s.equals(myApp.ACTIVITY_A)){
        Intent intent = new Intent(this,ActivityA.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(intent);
    }

    if(s.equals(myApp.ACTIVITY_B)){
        Intent intent = new Intent(this,ActivityB.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(intent);
    }

    if(s.equals(myApp.ACTIVITY_C)){
        Intent intent = new Intent(this,ActivityC.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(intent);
    }
    finish();

Уведомления принимаются через широковещательный приемник, ожидающее намерение отправляется в активность X, которая на основе имени текущей активности (хранится в приложении) отправляет намерение в текущую активную деятельность и принимается в методе onNewIntent.

1 голос
/ 14 декабря 2011

Вы пробовали android: noHistory ?

...