Вопрос по android – Уведомления не приходят, когда приложение закрыто

3

У меня есть приложение для Android с push-уведомлениями, настроенными с помощью Urban Airship. Уведомления работают нормально, когда мое приложение открыто, но мне все равно нужно получать уведомления, когда мое приложение закрыто. Я посмотрел вокруг, но не нашел то, что работает. Я почти уверен, что проблема в моем манифесте, так что вот оно.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="za.co.foo.android.financials"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="11" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />

    <!-- Permissions for Urban Airship -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <!-- Not sure if required for C2DM -->
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />

    <!-- Only this application can receive the messages and registration result -->
    <permission android:name="za.co.foo.android.financials.permission.C2D_MESSAGE" android:protectionLevel="signature" />
    <uses-permission android:name="za.co.foo.android.financials.permission.C2D_MESSAGE" />

    <!-- This app has permission to register and receive message -->
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name" >
        <activity
            android:name=".InvestorRelations"
            android:label="@string/app_name" 
            android:screenOrientation="landscape" 
            android:theme="@android:style/Theme.Holo.NoActionBar">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- For Urban Airship -->
        <receiver android:name="com.urbanairship.CoreReceiver">
        </receiver>

        <receiver android:name="com.urbanairship.push.c2dm.C2DMPushReceiver"
                android:permission="com.google.android.c2dm.permission.SEND"
                android:enabled="true">
             <!-- Receive the actual message -->
             <intent-filter>
                 <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                 <category android:name="za.co.foo.android.financials" />
             </intent-filter>
             <!-- Receive the registration id -->
             <intent-filter>
                 <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                 <category android:name="za.co.foo.android.financials" />
             </intent-filter>
        </receiver>

        <receiver android:name="za.co.foo.android.financials.IntentReceiver" />

        <service android:name="com.urbanairship.push.PushService" />

    </application>

</manifest>

Вот мойIntentReceiver

public class IntentReceiver extends BroadcastReceiver {

    private static final String logTag = "IR Intent Receiver";

    @Override
        public void onReceive(Context context, Intent intent) {
        Log.i(logTag, "Received intent: " + intent.toString());
        String action = intent.getAction();

        if (action.equals(PushManager.ACTION_PUSH_RECEIVED)) {
            int id = intent.getIntExtra(PushManager.EXTRA_NOTIFICATION_ID, 0);

            Log.i(logTag, "Received push notification. Alert: "
                    + intent.getStringExtra(PushManager.EXTRA_ALERT)
                    + " [NotificationID="+id+"]");

            logPushExtras(intent);

        } else if (action.equals(PushManager.ACTION_NOTIFICATION_OPENED)) {
            Log.i(logTag, "User clicked notification. Message: " + intent.getStringExtra(PushManager.EXTRA_ALERT));

            logPushExtras(intent);

            Intent launch = new Intent(Intent.ACTION_MAIN);
            launch.setClass(UAirship.shared().getApplicationContext(), InvestorRelations.class);
            launch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            launch.putExtra("FromNotification", true);

            UAirship.shared().getApplicationContext().startActivity(launch);

        } else if (action.equals(PushManager.ACTION_REGISTRATION_FINISHED)) {
            Log.i(logTag, "Registration complete. APID:" + intent.getStringExtra(PushManager.EXTRA_APID)
                    + ". Valid: " + intent.getBooleanExtra(PushManager.EXTRA_REGISTRATION_VALID, false));
        }

    }

    public void logPushExtras(intent) {
        //Does some logging stuff
    }
}

Любая помощь будет отличной

Редактироват

Включен весь манифест, только название моей компании изменено на "foo".

Редактироват

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

Когда вы получаете push-сообщение, когда ваше приложение не активно, как вы хотите показать свое уведомление? Хотите использовать уведомление Android (строка состояния)? Shrikant
Ты получаешь их, когда они активны? (например, push-сообщения доставляются)? Anders Metnik
Нужно видеть ваш C2DMPushReceiver, так как он должен обрабатывать вещи в фоновом режиме. Если вы передаете полученное в службу или действие, вам необходимо установить wakelock, чтобы у вас было «процессорное время Anders Metnik
Да. На данный момент push-сообщение отображается в панели уведомлений. Я просто хочу, чтобы он делал то же самое, когда мое приложение не открыт Mike T
Да, push-сообщения доставляются и отображаются, если мое приложение активно или открыто в фоновом режиме Mike T

Ваш Ответ

2   ответа
2

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

Я думаю, что настоящая проблема заключается в том, что BroadcastReceiver был убит при принудительном закрытии приложения, но я не уверен.

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

1

mypackage"? и ваш приемник и т. д. в этом пакете? Потому что, похоже, все «myPackage» должны быть заменены на «com.urbanairship

Нет, это на самом деле не называется "myPackage". То есть удалить конфиденциальную информацию из вопроса. Из этого урока: Docs.urbanairship.com / дисплей / DOCS / ... Я заменил все "com.urbanairship.push.sample" на имя пакета, так как это, кажется, то, что требуется Mike T
Ну, если ты думаешь, что твоё имя пакета действительно очень чувствительное, то, боюсь, я не смогу тебе помочь. Так как я не могу найти головы или хвосты в вашем XML-файле, так как некоторые вещи называются «com.urbanairship», а некоторые «mypackage», как я могу узнать, какой из них вы набрали неправильно, а какой - правильно? и как узнать, что они действительно соответствуют вашей посылке. Я много справлялся с этим в c2dm, и это очень большая проблема. Anders Metnik
Отредактировал вопрос, чтобы включить весь манифест и скрыть меньше информации о пакете Mike T
Хорошо, я немного обеспокоен тем, что у вас есть приемник в 1 упаковке, а фильтры для интентирования указывают на совершенно другой. Но если ты получаешь push msg ', все будет хорошо, и тогда мне нужно увидеть код твоего получателя. Anders Metnik
Это первый раз, когда мне приходилось использовать приемники, так что, может быть, с ними что-то не так. Я приму любые предложения, которые даны. Я просто скопировал и изменил образец кода Urban Airship. Я сейчас отредактирую свой вопрос Mike T

Похожие вопросы