2015-04-29 3 views
1

Я пытаюсь получить push-уведомление, работающее в моем приложении для Android, используя parse.com's push notification service. Они реализуют приемник вещания, который я простирающийся в своем собственном классе:Как осуществлять BroadcastService с активностью?

public class MyPushBroadcastReceiver extends ParsePushBroadcastReceiver 
{ 
    @Override 
    protected void onPushReceive(Context context, Intent intent) 
    { 
     JSONObject data = getDataFromIntent(intent); 

     [...] 

     super.onPushReceive(context, intent); 
    } 

    @Override 
    protected void onPushOpen(Context context, Intent intent) 
    { 
     ParseAnalytics.trackAppOpenedInBackground(intent); 

     Intent i = new Intent(context, MyActivity.class); 
     i.putExtras(intent.getExtras()); 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 
    } 
} 

Я наиважнейшие два метода:

  • onPushReceive - это называется, когда поступает уведомление
  • onPushOpen - это вызывается, когда пользователь нажимает на уведомления в области уведомлений

Есть три вещи, которые мне нужно сделать:

  1. Когда приходит уведомление, мне нужно, чтобы сохранить его
  2. Когда пользователь нажимает на уведомление, мне нужно, чтобы открыть приложение к деятельности, которая отображает уведомления я сохраненные
  3. Если поступает уведомление в то время как приложение открыто для активности уведомлений о просмотре, мне нужно обновить интерфейс, чтобы включить новое действие.

Первая часть была простой. Я просто пишу JSON в файл.

Второй, с которым у меня не было проблем. Я создаю намерение, и это открывает мою деятельность. Он читает JSON из файла, а Боб - ваш дядя.

Я не смог найти чистый способ обработки третьей части.

Я думаю, что я застрял в том, что у меня нет четкого представления о жизненном цикле деятельности или BroadcastServices. Я тоже не создаю, в своем приложении они объявлены в манифесте и создаются каждый раз.

Создает ли фреймворк Android один из них, поскольку он обрабатывает манифест? Возможно ли, чтобы активность обнаружила экземпляр BroadcastReceiver? Если бы я мог, мне было бы легко подключить обратный вызов между ними.

Или мне нужно определить свой собственный BroadcastService, который ParsePushBroadcastReceiver будет использовать для публикации событий и что активность будет потреблять? Примеры, которые я видел при этом, кажутся чрезмерно сложными для того, что должно быть довольно простым.

Справка будет принята с благодарностью.

+0

Извините, что задал неуместный вопрос. Я новичок в синтаксическом анализе, каждый ли он должен использовать эту строку кода «trackAppOpenedInBackground» или только начальную страницу для отслеживания? – NaiveBz

ответ

2

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

Может быть несколько экземпляров Activity, но только один может быть активным в любое время.

Я провел некоторое время, играя с настройкой различных флагов на намерении, которое я передал в startActivity(), и мне не понравилось ни одного поведения, которое я бы увидел.(Некоторые комбинации будут разбиваться, некоторые из них будут создавать несколько записей в стеке, чтобы кнопка возврата вернула вас к более старому экземпляру активности, все из которых создали визуальные эффекты, поскольку старая активность была заменена новым.)

Итак, почему бы не создать статическое поле, указывающее на текущую активность?

public class MyActivity extends Activity implements ReceiveNotifications 
{ 
    public static ReceiveNotifications notificationReceiver = null; 

    @Override 
    protected void onResume() 
    { 
     super.onResume(); 
     NotificationsActivity.notificationReceiver = this; 

     updateMessages(); 
    } 

    @Override 
    protected void onPause() 
    { 
     NotificationsActivity.notificationReceiver = null; 
     super.onPause(); 
    } 

    @Override 
    public void notificationReceived() 
    { 
     updateMessages(); 
    } 

    private void updateMessages() 
    { 
     [...] 
    } 
} 

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

public interface ReceiveNotifications 
{ 
    void notificationReceived(); 
} 

Тогда, когда мы получим уведомление, если notificationReceiver не равно нулю, мы называем notificationReceived():

public class MyPushBroadcastReceiver extends ParsePushBroadcastReceiver 
{ 
    @Override 
    protected void onPushReceive(Context context, Intent intent) 
    { 
     JSONObject data = getDataFromIntent(intent); 

     [...] 

     super.onPushReceive(context, intent); 

    if (MyActivity.notificationReceiver != null) 
     MyActivity.notificationReceiver.notificationReceived(); 
    } 

    @Override 
    protected void onPushOpen(Context context, Intent intent) 
    { 
     ParseAnalytics.trackAppOpenedInBackground(intent); 

     Intent i = new Intent(context, MyActivity.class); 
     i.putExtras(intent.getExtras()); 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 
    } 
} 
1

Вы можете использовать метод Activity для onNewIntent() (docs) для отправки новой информации о чем-то, а затем отобразить подсказку.

+0

Я хочу, чтобы BroadcastReceiver обновлял действие только в том случае, если активность активна. Я не хочу доводить деятельность вперед, если это не так. –

+0

В этом случае вы можете сохранить контекст активности в некоторой статической переменной. Когда вы получаете новое уведомление, проверяйте эту статическую переменную, если не null, используйте это для отображения приглашения пользователю. – Manish

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

  • Нет связанных вопросов^_^