Ошибка при попытке нажать на Push Notification Android

Привет всем, у кого возникла острая проблема с этим Push-уведомлением для Android. Я настроил пользовательский приемник. Я могу отправлять и просматривать Push-уведомления. Но когда я нажимаю на уведомление, я получаю сообщение об ошибке ниже.

FATAL EXCEPTION: main
                                                                               Process: com.rocketapptechnologies.listout, PID: 29566
                                                                               java.lang.RuntimeException: Unable to start receiver com.rocketapptechnologies.receiver.ParseReceiver: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
                                                                                   at android.app.ActivityThread.handleReceiver(ActivityThread.java:2586)
                                                                                   at android.app.ActivityThread.access$1700(ActivityThread.java:157)
                                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1403)
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:110)
                                                                                   at android.os.Looper.loop(Looper.java:193)
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5310)
                                                                                   at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                   at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
                                                                                   at dalvik.system.NativeStart.main(Native Method)
                                                                                Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
                                                                                   at android.app.ContextImpl.startActivity(ContextImpl.java:1130)
                                                                                   at android.app.ContextImpl.startActivity(ContextImpl.java:1117)
                                                                                   at android.content.ContextWrapper.startActivity(ContextWrapper.java:311)
                                                                                   at android.content.ContextWrapper.startActivity(ContextWrapper.java:311)
                                                                                   at com.rocketapptechnologies.receiver.ParseReceiver.onPushOpen(ParseReceiver.java:24)
                                                                                   at com.parse.ParsePushBroadcastReceiver.onReceive(ParsePushBroadcastReceiver.java:123)
                                                                                   at android.app.ActivityThread.handleReceiver(ActivityThread.java:2579)
                                                                                   at android.app.ActivityThread.access$1700(ActivityThread.java:157) 
                                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1403) 
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:110) 
                                                                                   at android.os.Looper.loop(Looper.java:193) 
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5310) 
                                                                                   at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                                   at java.lang.reflect.Method.invoke(Method.java:515) 

Но, как видите, у меня есть ключ намерения, чтобы начать действие. Меня это начинает раздражать, так что, надеюсь, кто-то поделится опытом :)

Это мой собственный приемник: package com.rocketapptechnologies.receiver;

import android.app.Notification;
import android.content.Context;
import android.content.Intent;

import com.parse.ParsePushBroadcastReceiver;
import com.rocketapptechnologies.listout.LoginActivity;

/**
 * Created by KieranMcc on 20/01/2016.
*/
public class ParseReceiver extends ParsePushBroadcastReceiver {

public ParseReceiver(){

}

@Override
protected void onPushOpen(Context context, Intent intent) {
    super.onPushOpen(context, intent);
    Intent i = new Intent(context, LoginActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(i);
}
}

А это теги приемника и служб ManifestFiles.

<service android:name="com.parse.PushService" />
    <receiver android:name="com.parse.ParsePushBroadcastReceiver"
        android:exported="false">
        <intent-filter>
            <action android:name="com.parse.push.intent.RECEIVE" />
            <action android:name="com.parse.push.intent.DELETE" />
        </intent-filter>
    </receiver>
    <receiver android:name="com.rocketapptechnologies.receiver.ParseReceiver"
        android:exported="false">
        <intent-filter>
            <action android:name="com.parse.push.intent.OPEN" />
        </intent-filter>
    </receiver>
    <receiver android:name="com.parse.GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

            <!--
              IMPORTANT: Change "com.parse.starter" to match your app's package name.
            -->
            <category android:name="com.rocketapptechnologies.listout" />
        </intent-filter>
    </receiver>

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

Спасибо, что прочитали мой вопрос, и очень надеюсь, что вы можете помочь, чтобы я действительно мог продолжить работу над своим приложением xD


person SmiffyKmc    schedule 20.01.2016    source источник


Ответы (1)


Я сделал запись в блоге и видео для друга, пошагово объясняющего, как настроить push-уведомления на Android.

Я надеюсь, что это поможет вам. Вот ссылка

person TooManyEduardos    schedule 20.01.2016
comment
Вот некоторые глубокие знания о push-уведомлениях! Идеально! Собираюсь пробежаться по лоту и изучить его. Если это сработает, я установлю этот ответ как правильный :). Спасибо за очень быстрый ответ, чувак! - person SmiffyKmc; 21.01.2016
comment
Без проблем. Я не знаю, имеет ли для вас больше смысла видео, чем блог, но оба они находятся по одной и той же ссылке. - person TooManyEduardos; 21.01.2016
comment
Спасибо за ссылку и видео. Он прояснил некоторые вещи, но по-прежнему появляется сообщение об ошибке, говорящее о том, что для вызова startActivity() из-за пределов контекста действия требуется флаг FLAG_ACTIVITY_NEW_TASK. Это действительно то, что вы хотите? Каждый раз, когда я нажимаю на уведомление :/ - person SmiffyKmc; 21.01.2016
comment
Это зависит от того, что вы делаете, когда нажимаете уведомление. - person TooManyEduardos; 21.01.2016
comment
То, что я думаю, что делаю (больше похоже на то, что хочу сделать), это то, что после того, как я нажму на него, я просто хочу, чтобы оно открыло одно из моих действий в качестве теста. В приведенном выше коде я настроил Receiver, который является подклассом ParsePushBroadcastReceiver. И с помощью PushOpen я думал, что открою его. Могу ли я ошибаться или я что-то упускаю? - person SmiffyKmc; 21.01.2016
comment
Это сильно зависит от того, что вы подразумеваете под открытым одним из моих действий. Если все, что вам нужно, это уведомление об открытии вашего приложения, то вам даже не нужен приемник, но вам нужно установить пакет SDK для синтаксического анализа (и болты), а пакет SDK будет обрабатывать часть приемника. Однако, если вы хотите, чтобы приложение открывалось при каком-то конкретном действии (например, с идентификатором сообщения 123), вам придется создать подкласс получателя и обработать его самостоятельно. - person TooManyEduardos; 21.01.2016
comment
Да, я пытаюсь открыть определенное действие, поскольку я работаю над тем, чтобы данные отправлялись и отображались в действии для сохранения в базе данных. Я дошел до того, что отправлял пользователям push-уведомления, но я хочу, чтобы пользователь затем нажимал на push-уведомление, и это открывало определенное действие. Класс приемника наверху - это то, что я использую. Полностью наклонился, так как я не могу найти ничего о том, как это сделать. Я чувствую, что код, который я сделал, сделал бы это, но я получаю эту ошибку. Любые идеи? Спасибо также за помощь! - person SmiffyKmc; 21.01.2016
comment
Эй, кажется, я понял это! Вы просто хотите начать новое конкретное действие и отобразить сообщение? Если да, то я разобрался. Но задний ход... это другое дело. - person TooManyEduardos; 22.01.2016
comment
Да!! На данный момент просто начните конкретную деятельность, чтобы я знал, как это работает, чтобы расширяться в ней :)! Большое спасибо за помощь! Если у вас есть ответ, я могу попробовать и установить его как ответ! - person SmiffyKmc; 22.01.2016
comment
Сегодня утром я сделал новый учебник с новой информацией здесь: toomanytutorials.blogspot.com/2016/01/. У меня все еще не было времени проверить его, загрузить окончательный проект на github или создать окончательные GIF-файлы, но основная часть данных здесь. Дайте мне знать, как это происходит, пожалуйста. - person TooManyEduardos; 22.01.2016
comment
Спасибо за помощь! Дал мне много информации о том, как это работает. Боюсь, я все еще получаю это исключение ошибки. Я шел по тому же пути, что и вы сказали в учебнике. У меня есть сильное ощущение, что сейчас это как-то связано с задним стеком. Кажется, когда я пытаюсь открыть действие из приемника, оно просто не хочет открываться. - person SmiffyKmc; 24.01.2016
comment
Вы изменили имя получателя в манифесте, чтобы оно было вашим собственным получателем? - person TooManyEduardos; 25.01.2016
comment
Да, это было первое, что я сделал. Даже поместите класс Receiver в ту же папку, где находится MainActivity, чтобы имя .Receiver было таким же, чтобы не ошибиться. Я на самом деле сбит с толку, почему это не работает. Проверил другие вопросы, которые могут быть такими же, но ничего. Будет ли это проблемой заднего стека? Что действие все еще находится в стеке, и я пытаюсь создать его снова из флага, вместо того, чтобы вывести его на передний план? - person SmiffyKmc; 25.01.2016
comment
Нет, если приложение закрыто и не работает в фоновом режиме... ваш приемник все еще называется ParseReceiver? Я бы, наверное, изменил это для начала. - person TooManyEduardos; 25.01.2016
comment
Изменил его на CustomReceiver и протестировал его, но все равно ошибка, попытался изменить флаг также на Перенесено на передний план, чтобы увидеть, работает ли он, и просто использовать его. Будет ли это проблемой с контекстом, который я использую? Совершенно невежественный в этом сейчас, поскольку я чувствую, что перепробовал все. - person SmiffyKmc; 25.01.2016
comment
Если вы не переопределите какой-либо метод в приемнике или если вы удалите свой пользовательский приемник и измените манифест, чтобы использовать приемник синтаксического анализа, откроется ли приложение при касании нового полученного push-уведомления? - person TooManyEduardos; 25.01.2016
comment
Хорошо, кажется, мы что-то с этим делаем :) После смены пользовательского получателя на исходный и повторной отправки push приложение открывается без ошибок. Может быть, это мой пользовательский приемник? - person SmiffyKmc; 25.01.2016
comment
Да, я проверю манифест, чтобы убедиться, что в нем нет опечатки. Вам не нужен конструктор на приемнике. Затем выполняйте действия с журналами шаг за шагом в методе onPushOpen. Проверьте контекст и передаваемое намерение. Может быть, попробуйте запускать приложение пошагово, прежде чем добавлять код. - person TooManyEduardos; 25.01.2016
comment
Я попробую! Еще раз спасибо, что остановились на этом вопросе. Ничего не мог придумать, почему не работает. Надеюсь, это будет что-то вроде создания Конструктора, который все это улавливал. - person SmiffyKmc; 25.01.2016
comment
Без проблем. Дайте мне знать, как это закончится - person TooManyEduardos; 25.01.2016
comment
Все та же ошибка ›‹! Затем я попытался записать это шаг за шагом. Все работает отлично, пока я не открываю кнопку. Когда дело дошло до намерения и установки контекста, я увидел ReceiverRestrictedContext, поэтому подумал, что это может быть контекст, который он использует. Я попытался привести его к классу приложения, который я назвал StartClass, и использовал этот контекст, но ничего. Должен ли я звонить получателю из любого места? - person SmiffyKmc; 25.01.2016
comment
Таким образом, это будет означать, что ваш сбой связан с действием, которое получило намерение от получателя, а не от самого получателя. Как вы получаете это намерение и данные? Какова трассировка стека ошибки? - person TooManyEduardos; 25.01.2016
comment
Искренне извиняюсь за задержку! Не получение намерения от действия. Надеялся, что он просто откроет его, как и другое намерение, с началом активности. Все, что я когда-либо получаю в трассировке стека, - это ошибка, говорящая, что мне нужен флаг, чтобы начать новое действие.... но это то, что у меня есть ›‹ - person SmiffyKmc; 27.01.2016