Подтвердить что ты не робот

Освежающая активность при получении уведомления gcm push

Как обновить активность при получении gcm push уведомления, если мое приложение открыто. У меня есть активность, которая содержит listview, заполненную данными с сервера. Я хочу обновить свою активность (, добавив еще один элемент в listview), если я получаю уведомление gcm push (в котором также содержатся некоторые данные).

  • Один из вариантов заключается в добавлении таймера, который периодически выполняет запросы сервера и обновляет данные адаптера списка, но я не хочу их, потому что для этого потребуется много ресурсов.
  • Нужно ли добавлять широковещательный приемник, который будет запускаться при приеме gcm push, который далее запрашивает новые данные сервера и обновляет мой интерфейс активности?

Уважаемые комментаторы, пожалуйста, внимательно прочитайте вопрос, мне нужно только обновить список (если приложение открыто и эта конкретная активность открыта) иначе нет необходимости в том же.

4b9b3361

Ответ 1

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

Идея состоит в том, что вам необходимо зарегистрировать свою деятельность в качестве широковещательного приемника. Самый простой способ сделать это:

//register your activity onResume()
@Override
public void onResume() {
    super.onResume();
    context.registerReceiver(mMessageReceiver, new IntentFilter("unique_name"));
}

//Must unregister onPause()
@Override
protected void onPause() {
    super.onPause();
    context.unregisterReceiver(mMessageReceiver);
}


//This is the handler that will manager to process the broadcast intent
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        // Extract data included in the Intent
        String message = intent.getStringExtra("message");

        //do other stuff here
    }
};

Вышеприведенный код переходит в действие, которое вы хотите "прослушать" для событий.

Теперь, как мы отправляем данные этому "слушателю"? Перейдите к обработчику уведомлений push (или из которого вы хотите обновить свою активность), и когда вы получите уведомление, вызовите эту функцию:

// This function will create an intent. This intent must take as parameter the "unique_name" that you registered your activity with
static void updateMyActivity(Context context, String message) {

    Intent intent = new Intent("unique_name");

    //put whatever data you want to send, if any
    intent.putExtra("message", message);

    //send broadcast
    context.sendBroadcast(intent);
}

Когда вы вызываете вышеуказанную функцию, ваша деятельность должна ее получить.

Примечание. Ваша активность должна быть запущена/открыта для приема трансляции.

Примечание2: я переключился на библиотеку под названием 'otto'. Это на самом деле то же самое, но проще, "трансляция событий" по сравнению с приложением. Здесь ссылка http://square.github.io/otto/

Ответ 2

Я предполагаю, что ваш GCMBroadcastReceiver есть в нем собственный .java файл?

Что касается обновления активности, я также хотел бы узнать ответ на этот вопрос.

Но для того, чтобы узнать, активна ли какая-либо конкретная активность, значение на экране просто добавляет boolean (назовите его что-то вроде "active" ) и установите значение true в вашем мероприятии onResume(), а затем false в событии onPause():

protected void onResume()
{
    super.onResume();

    active = true;;
}

protected void onPause()
{
    super.onPause();

    active = false;
}

Ваша переменная active будет логической, которая равна global или static. Таким образом, вы знаете, что определенная деятельность находится в "переднем" режиме.

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

Ответ 3

Ответ на прием действительно правильный для "Обновление активности при получении gcm push notification" (я тоже его поддержал). Но если вы хотите обновить ListView, который отображается, вам не нужен широковещательный приемник.

Служба GCM прослушивателя может обновлять базу данных с помощью ContentProvider, а не вставлять прямой SQL-запрос.

Тогда вы можете положиться на метод notifyChange на ContentResolver, чтобы сделать трюк.

Сообщите зарегистрированным наблюдателям, что строка была обновлена. Чтобы зарегистрироваться, позвоните registerContentObserver(). По умолчанию объекты CursorAdapter получат это уведомление. Если syncToNetwork истинно, это будет пытаться запланировать локальную синхронизацию с использованием адаптера синхронизации, который зарегистрирован для полномочия предоставленного uri. Никакая учетная запись не будет передана синхронизации адаптер, поэтому все соответствующие учетные записи будут синхронизированы.

Ответ 4

Если ваше приложение уже запущено, попробуйте переопределить метод onNewIntent

Ответ 5

Кажется, есть более простой способ. В методе OnMessageReceived для прослушивателя GCM вы можете просто выполнить обновление оттуда вместо отправки уведомления. Вы можете использовать тот же код, который вы использовали бы при обработке уведомления. Если вы используете StartActivity из прослушивателя, вы должны использовать флаг ActivityFlags.NewTask.

Ответ 6

Подводя итог одному предложению: Если вы хотите обновить активность, широковещать свое настраиваемое событие, когда уведомление прибывает и зарегистрировать вашу активность как широковещательный приемник этого события

Ответ 7

Intent notificationIntent = new Intent(context, MainActivity.class);
notificationIntent.setAction(Long.toString(System.currentTimeMillis()));
PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);